将函数应用于 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_1
和 old_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
我找到了这个问题的几个答案,但 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_1
和 old_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