pandas统计每行症状Yes值总数创建新列报真值歧义错误求解
报错根因
你传入自定义函数的df["Cough"]、df["Myalgia"]等对象是pandas的整列数据(Series类型),不是单个单元格的取值。当你在if条件里写Cough == "Yes"时,得到的是一整列由True/False组成的布尔序列,Python无法将一组布尔值判定为单个真/假值来走分支逻辑,就会抛出这个歧义错误。
原代码的额外逻辑问题
除了触发报错的传参错误,你的函数本身还有两个逻辑bug,就算解决传参问题也无法得到正确结果:
- 分支判断用了
elif,只要靠前的某一列值为Yes,后续所有列的判断都会被跳过,无法统计所有症状列的Yes总数 - 计数变量
number定义在函数外部,既存在作用域修改报错的问题,也会导致计数跨样本累计,无法实现逐行单独统计的需求。
推荐实现方案
pandas做这类逐行统计优先用向量化运算,不需要写自定义遍历函数,运行效率远高于逐行循环,代码也更简洁:
# 所有需要统计的症状列统一放在列表中,后续增减列直接修改列表即可 symptom_columns = ["Cough", "Myalgia", "Headache", "SoreThroat", "Fatigue"] df["NumberSymptoms"] = (df[symptom_columns] == "Yes").sum(axis=1)
运行后直接得到符合预期的结果,和你给出的示例表计算规则完全匹配。
如果你确实需要用自定义函数实现(仅作参考,大数据量下性能差),需要配合apply指定按行传入数据,且把计数变量放在函数内部:
def count_symptoms(single_row): symptom_count = 0 for col in ["Cough", "Myalgia", "Headache", "SoreThroat", "Fatigue"]: if single_row[col] == "Yes": symptom_count += 1 return symptom_count df["NumberSymptoms"] = df.apply(count_symptoms, axis=1)
内容的提问来源于stack exchange,提问作者l15
相关产品推荐
相关产品推荐

