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

如何向**kwargs传递大量参数?Pandas数据帧参数传递优化问询

简化Pandas Apply中大量参数的传递方法

嘿,我看到你的问题了——当拆分s列后生成十几甚至二十多列时,手动逐个传递参数不仅繁琐,还容易出错。先给你指出当前代码里的一个关键问题,再分享两个高效的简化方案:

先修正你当前代码的小错误

你现在的lambda里直接用df['p']、df['s0']这类写法,其实是把整个**列(Series)**传递给func,而不是当前行的单个值。正确的写法应该用x['p']、x['s0']来获取当前行对应列的值,并且别忘了加上axis=1(apply默认按列处理,axis=1才是按行遍历)。

方案1:手动指定目标列,用字典解包传递

如果你的目标列是固定的,可以先把需要传递的列名整理成一个列表,然后将当前行的这些列转成字典,用**解包成关键字参数传给func:

def func(p, p_loc, **kwargs):
    print(p)
    print(p_loc)
    print(kwargs)
    # 这里添加你的业务逻辑,最后返回结果给new列
    return "处理完成"

# 整理需要传递的参数列
target_cols = ['s0', 's1', 's2', 's3', 's0_loc', 's1_loc', 's2_loc', 's3_loc']

# 按行应用函数
df['new'] = df.apply(lambda x: func(x['p'], x['p_loc'], **x[target_cols].to_dict()), axis=1)

这样不管列数有多少,只要把列名加到target_cols列表里就行,不用逐个写参数。

方案2:用正则自动匹配目标列(适合列名有规律的场景)

如果拆分后的列名有统一规律(比如都是s+数字,或者s*_loc的格式),可以用df.filter()结合正则表达式自动筛选出这些列,完全不用手动列出来:

# 用正则匹配所有s开头加数字的列,以及s数字_loc的列
target_cols = df.filter(regex=r'^s\d+$|^s\d+_loc$').columns

df['new'] = df.apply(lambda x: func(x['p'], x['p_loc'], **x[target_cols].to_dict()), axis=1)

这个方案特别适合列数很多的情况——哪怕有20列,一行代码就能自动筛选出所有需要传递的列,非常省心。

原理说明

x[target_cols].to_dict()会把当前行的目标列转换成一个{列名: 当前行对应值}的字典,然后**操作符会把这个字典解包成多个关键字参数,正好匹配func里的**kwargs参数。这样就实现了批量传递参数的效果。

内容的提问来源于stack exchange,提问作者Avinash Clinton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:16:02