Pandas调用apply做列条件替换时报Series真值歧义错误的原因
错误原因
- 你代码中
if data['Campaign Name'].isna()的判断对象是整个列的布尔Series,Python原生的if...else分支仅支持判断单个布尔值,无法直接处理一串布尔值的集合,系统无法确认你是要所有值为True才走if分支,还是任意一个为True就走if分支,因此抛出歧义错误。 - 你误用了
apply的逻辑:如果调用data.apply()时不指定axis=1,默认是按列遍历;就算指定了按行遍历,你在lambda里直接调用data['列名']也是取整个列的所有值,而非当前遍历行的对应字段值。
正确实现方式
你要实现的是逐行判断Campaign Name是否为空,为空则取同行Event Code,否则取Campaign Name,直接用Pandas向量化方法即可,不需要写apply:
# 方法1:用np.where,逻辑最直观 import numpy as np data['target_col'] = np.where(data['Campaign Name'].isna(), data['Event Code'], data['Campaign Name']) # 方法2:用pandas自带的where方法 data['target_col'] = data['Campaign Name'].where(data['Campaign Name'].notna(), data['Event Code'])
如果你一定要用apply实现(不推荐,性能远低于向量化方法),需要指定按行遍历,且取当前行的字段值:
import pandas as pd data['target_col'] = data.apply(lambda x: x['Event Code'] if pd.isna(x['Campaign Name']) else x['Campaign Name'], axis=1)
内容的提问来源于stack exchange,提问作者Gwen Lee
相关产品推荐
相关产品推荐

