
本文介绍如何使用列名列表配合解包操作符 *,高效地将 dataframe 中的多个指定列作为参数传入自定义函数,避免手动逐列书写,提升代码可维护性与可读性。
在 Pandas 中处理多列数据时,常需将若干列的值共同传入一个自定义函数进行计算(例如组合特征生成、条件逻辑判断或数值变换)。若列数较多(如 A–J 共 10 列),直接写成 x.A, x.B, x.C, ..., x.J 不仅冗长易错,也难以动态调整。理想方式是预先定义列名列表,并利用 Python 的解包机制批量传参。
核心技巧在于:
✅ 先用列名列表 cols 索引 DataFrame 得到子 DataFrame(df[cols]);
✅ 对该子 DataFrame 沿行方向(axis=1)应用 apply;
✅ 在 lambda 中使用 *x 将当前行 Series 解包为位置参数,自动匹配函数形参顺序。
以下是一个完整示例:
import pandas as pd
import numpy as np
np.random.seed(26)
df = pd.DataFrame(np.random.randint(10, size=(3, 3)), columns=list('ABC'))
print("原始数据:")
print(df)
# A B C
# 0 5 6 0
# 1 1 6 3
# 2 0 4 2
def myfunction(a, b, c):
return (a + b, b * c, a - c) # 示例:返回三元组
cols = ['A', 'B', 'C']
df['result'] = df[cols].apply(lambda x: myfunction(*x), axis=1)
print("\n新增结果列:")
print(df)
# A B C result
# 0 5 6 0 (11, 0, 5)
# 1 1 6 3 (7, 18, -2)
# 2 0 4 2 (4, 8, -2)⚠️ 注意事项:
- 列名列表 cols 中的顺序必须与目标函数的参数顺序严格一致;
- 所有列应为同质数据类型(或函数能兼容的类型),否则解包后可能引发类型错误;
- 若函数需关键字参数(而非位置参数),可改用 **x.to_dict()(要求列名与函数参数名完全匹配);
- 性能敏感场景建议优先考虑向量化操作(如 +, np.where),apply(axis=1) 属于逐行循环,大数据量下较慢。
总结:借助 df[cols].apply(lambda x: func(*x), axis=1) 模式,你只需维护一个清晰的列名列表,即可灵活、安全、可复用地将任意数量的列批量注入函数——这是 Pandas 高级数据处理中兼顾简洁性与扩展性的关键实践。










