pandas用lambda比较DataFrame两列值报ValueError的原因及解决
报错产生原因
你写的lambda代码触发报错有两个核心问题:
- 作用域引用错误:使用
df.apply(..., axis=1)时,传入lambda的形参代表逐行遍历的单行Series对象,但你在lambda内部没有使用这个行对象取值,反而直接引用了整个DataFrame的A列df['A']。df['A'] == 1返回的是一整列布尔值组成的Series,而if分支判断需要单个明确的布尔值,Pandas无法直接把整列布尔Series转成单个True/False,就会抛出你看到的真值歧义报错。 - 判断逻辑写错:你的需求是对比同一行A列和B列的值是否相等,但你写的判断条件是
df['A']==1,和需求逻辑完全不符。
基于lambda的修正写法
把lambda内部的取值改成从当前遍历的行对象取数即可,修正后的代码如下:
import pandas as pd df = pd.DataFrame({'A': [1,2,3], 'B': [1,4,5]}) # 注意lambda里取当前行的A、B列值对比,不要引用全表df的列 df['is_equal'] = df.apply(lambda row: 1 if row['A'] == row['B'] else 0, axis=1)
运行后就能得到你期望的结果:
A B is_equal 0 1 1 1 1 2 4 0 2 3 5 0
补充提示:这种逐行apply的写法性能远低于向量化实现,比如你之前已经掌握的
np.where、(df['A'] == df['B']).astype(int)都是向量化写法,数据量越大性能差距越明显,简单列运算场景优先选择向量化方案。
内容的提问来源于stack exchange,提问作者union77
相关产品推荐
相关产品推荐

