如何用Pandas apply函数按行传多列数据到自定义函数生成新列
解决Pandas按行apply传入多列列表/Series和单列值到自定义函数的问题
你的需求是将DataFrame中['A','B','C']三列作为列表参数x,Val列作为参数y传入自定义函数f,生成新列Result。先修正你现有代码的错误,再给出两种符合需求的实现方式:
错误点说明
你当前的apply调用里,axis=1参数被错误地放在了lambda函数内部,它应该是df.apply()的参数,用于指定按行处理数据。
正确实现方式
方式1:直接传入Series(兼容sum操作)
你的函数f中使用了sum(x),而Pandas的Series本身支持sum()方法,因此可以直接将row[['A','B','C']]这个Series传给参数x,无需额外转换:
df['Result'] = df.apply(lambda row: f(row[['A','B','C']], row['Val']), axis=1)
方式2:明确转换为列表(满足列表参数需求)
如果需要严格将x以列表形式传入函数,只需给Series添加tolist()方法完成转换:
df['Result'] = df.apply(lambda row: f(row[['A','B','C']].tolist(), row['Val']), axis=1)
完整可运行代码
将修正后的代码整合到你的示例中,完整代码如下:
import pandas as pd cols=['Name','A','B','C','Type','Val'] data = [['Front',1,2,3,'Up',11], ['Front',4,5,6,'Dw',22]] df = pd.DataFrame(data, columns=cols) def f(x,y): return sum(x)*y # 以方式2为例(转列表) df['Result'] = df.apply(lambda row: f(row[['A','B','C']].tolist(), row['Val']), axis=1) print(df)
运行后输出与你期望的结果一致:
Name A B C Type Val Result 0 Front 1 2 3 Up 11 66 1 Front 4 5 6 Dw 22 330
补充提示
- 使用
axis=1时,apply会将每一行数据封装为Series传递给lambda的row参数; - 若自定义函数对参数类型有严格要求(必须是列表),则用
tolist()转换;若函数兼容Series(如sum、max等通用操作),直接传Series更简洁; - 注意lambda函数的参数顺序要与
f的参数定义对应,避免传参错误。
内容的提问来源于stack exchange,提问作者dingo
相关产品推荐
相关产品推荐

