Python Pandas:如何在DataFrame的lambda函数中访问多列?
Pandas 多列计算实现说明
你当前写法的问题
你尝试的df['value_b'].apply(lambda x: some_function(x, df['value_c'])) 是无法正常得到预期结果的:
- 这段代码里apply是单独作用在
value_b列上的,lambda拿到的x只是每一行对应的单个value_b数值 - 传入函数的
df['value_c']是整列的Series对象,不是当前行匹配的单个value_c值,既不符合自定义函数的参数要求,也无法完成逐行的匹配计算
可行的实现方案
Pandas完全支持在计算中同时访问多列数据,根据性能优先级有三类常用写法:
1. 整表逐行apply(最通用的写法)
把apply作用在整个DataFrame上,指定axis=1参数,就可以逐行拿到整行的数据,灵活取任意多列传入自定义函数:
df['value_d'] = df.apply( lambda row: some_function(row['value_b'], row['value_c']), axis=1 # 逐行遍历,设为0则是逐列遍历 )
这种写法没有列数限制,不管你的自定义函数需要2列还是多列的同行值,都可以通过row['列名']的方式自由取值。
2. 直接向量化传参(性能最优,优先推荐)
如果你的自定义函数支持逐元素运算(比如内部是加减乘除等基础逻辑,或者基于numpy实现的计算),完全不需要套apply,直接把整列作为参数传入即可,计算效率比逐行apply高几个数量级,尤其适合十万行以上的大表:
df['value_d'] = some_function(df['value_b'], df['value_c'])
如果自定义函数原本是为单值场景写的、不支持Series输入,可以用numpy.vectorize把函数包装成支持向量化输入的版本,同样能获得远高于逐行apply的性能:
import numpy as np # 包装原生单值函数为向量化版本 vec_some_func = np.vectorize(some_function) df['value_d'] = vec_some_func(df['value_b'].values, df['value_c'].values)
3. 单列apply取同行其他列(不推荐)
理论上你也可以在单列的apply回调里,通过行索引定位其他列的值,但这种写法逻辑冗余、性能差,遇到重复索引还会出逻辑错误,非必要不使用:
# 不推荐:每一行都要做一次索引查询,开销高、易出错 df['value_d'] = df['value_b'].apply( lambda x: some_function(x, df.loc[x.name, 'value_c']) )
内容的提问来源于stack exchange,提问作者finethen
相关产品推荐
相关产品推荐

