
本文介绍在 pandas 中通过列名列表动态选取多列,并利用 `apply()` 和解包操作符 `*` 将其高效传入自定义函数的方法,避免手动书写冗长的列引用,提升代码可维护性与扩展性。
在使用 Pandas 进行数据处理时,常需将多列数据联合传入自定义函数(如特征工程、复合计算等)。当列数较多(例如 A–J 共 10 列)时,逐个写 x.A, x.B, ..., x.J 不仅繁琐,还易出错且难以维护。理想方案是:先将列名存入列表,再统一提取并解包传参。
核心技巧在于两点:
- 使用 df[cols] 按列名列表索引子 DataFrame(返回按指定顺序排列的列);
- 在 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, c) # 示例:返回元组
cols = ['A', 'B', 'C'] # ✅ 列名列表,支持任意长度和顺序
df['out'] = df[cols].apply(lambda x: myfunction(*x), axis=1)
print("\n添加计算结果列:")
print(df)
# A B C out
# 0 5 6 0 (5, 6, 0)
# 1 1 6 3 (1, 6, 3)
# 2 0 4 2 (0, 4, 2)⚠️ 注意事项:
- 函数形参顺序必须与 cols 列表中列名的顺序严格一致;
- df[cols].apply(..., axis=1) 返回的是 Series,每行 x 是一个 pd.Series,*x 会按索引顺序(即 cols 顺序)解包其值;
- 若函数需处理缺失值,建议在函数内部增加 pd.isna() 判断,或提前用 dropna(subset=cols) 过滤;
- 对于性能敏感场景,优先考虑向量化操作(如 np.where, pd.cut)或 numba 加速,apply(axis=1) 在大数据量下较慢。
该方法简洁、通用、可读性强,是 Pandas 高级用法中的实用范式。










