将函数应用于 Pandas 数据框的两列

Apply function to two columns of a Pandas dataframe

我找到了这个问题的几个答案,但 none 似乎解决或解决了在我应用它们时弹出的错误。例如this answer 我有一个数据框 df 和一个函数 my_func(string_1,string_2),我正在尝试使用以下内容创建一个新列:

df.['new_column'] = df.apply(lambda x: my_func(x['old_col_1'],x['old_col_2']),axis=1)

我收到一个源自 my_func 内部的错误,告诉我 old_col_1 是 float 类型,而不是预期的字符串。特别是my_func的第一行是old_col_1 = old_col_1.lower(),错误是

AttributeError: 'float' object has no attribute 'lower'

通过使用数据帧打印输出包含调试语句,我已经验证 old_col_1old_col_2 确实都是字符串。如果我在将它们作为参数传递时显式地将它们转换为字符串,那么 my_func 的行为就像您将其作为字符串输入数字数据时所期望的那样,尽管列值显然不是数字。

根据 ,我什至明确确保这些列在创建数据框时不会被“智能地”错误转换:

df = pd.read_excel(file_name, sheetname,header=0,converters={'old_col_1':str,'old_col_2':str})

函数 my_func 单独调用时效果很好。所有这些让我怀疑正在传递数据帧中的索引或其他一些数字数据,而不是(排他地)列值。

其他实现似乎也存在同样的问题。例如,

df['new_column'] = np.vectorize(my_func)(df['old_col_1'],df['old_col_2'])

产生同样的错误。变体(例如使用 df['old_col_1'].to_numpy()df['old_col_1'].values 代替 df['old_col_1'])不要改变这个。

您的列中是否有 np.nan/None/null 数据?如果是这样,您可能会收到类似于此数据引起的错误

data = {
    'Column1' : ['1', '2', np.nan, '3']
}
df = pd.DataFrame(data)
df['Column1'] = df['Column1'].apply(lambda x : x.lower())
df