You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:22:48