Pandas调用自定义函数新增列触发DataFrame属性错误该如何解决?
问题根因
apply参数错误:df.apply(fun1(),axis=1)中写的是fun1(),属于直接执行函数拿到返回值,而非传入函数对象给apply遍历调用。当前示例数据中无xyz值,fun1()执行后返回字符串data not available,apply会将传入的字符串当做方法名,尝试对每行数据调用对应方法,找不到对应方法就抛出属性错误。- 函数无入参:按行调用
apply时,每次遍历会将当前行的Series对象作为参数传入处理函数,fun1没有定义入参,即便传入函数对象也会触发参数不匹配报错。 - 逻辑范围错误:原函数内的判断逻辑是扫描整个DataFrame的
col1列,而非判断当前行的col1值,不符合按行生成新列的需求。 - 返回值类型不匹配:原函数命中判断时返回的是单列DataFrame对象,无法直接赋值给新列的单个单元格。
修复方案
按行匹配的实现(每行判断col1是否为xyz,对应返回col2或提示文本)
def fun1(row): if row['col1'] == 'xyz': return row['col2'] else: return "data not available" # apply传入函数对象不要加括号 df['new_column'] = df.apply(fun1, axis=1)
全局判断的实现(全表存在xyz则所有行填充对应col2值,否则所有行填充提示文本)
如果你的需求是全局判断而非按行判断,不需要用apply,直接用下方代码性能更高:
if df['col1'].isin(['xyz']).any(): target_val = df.loc[df['col1'] == 'xyz', 'col2'].iloc[0] df['new_column'] = target_val else: df['new_column'] = "data not available"
内容的提问来源于stack exchange,提问作者Navya
相关产品推荐
相关产品推荐

