pandas列表推导式统计指定列PASSED值时报真值歧义错误解决
报错原因
代码触发报错的核心是混淆了pandas列对象(Series)和单个单元格值的判断逻辑:
- 代码中
frame[column] == 'PASSED'返回的不是单个True/False值,而是长度和DataFrame行数一致的布尔型Series,存储的是该列每一行是否等于PASSED的判断结果 - 你在列表推导式的
if条件里直接传入这个Series时,Python会尝试把整列转换成单个布尔值判断真假,这种模糊操作在pandas中是不被允许的,就会抛出你看到的ValueError: The truth value of a Series is ambiguous报错。
就算绕过这个报错,原代码的sum()逻辑是对多个Series做整体求和,也实现不了逐行统计指定列中PASSED数量的需求。
正确实现方案
优先使用pandas原生向量化运算实现,性能最高,适配任意行数的数据集:
import pandas as pd frame = pd.DataFrame( data = {'Age':['PASSED'], 'Maturity':['PASSED'],'Gender':['FAILED'], 'Height':['PASSED']} ) check_columns = ['Age','Maturity','Gender'] # 选中目标列逐元素判断是否为PASSED,按行统计True的数量 frame['result'] = frame[check_columns].eq('PASSED').sum(axis=1)
运行后示例数据的result列值为2,完全符合预期。
如果偏好逐行判断的写法,也可以用apply实现(注意:数据量较大时性能远低于上面的向量化方案):
frame['result'] = frame[check_columns].apply( lambda row: sum(1 for cell_val in row if cell_val == 'PASSED'), axis=1 )
内容的提问来源于stack exchange,提问作者JasonX
相关产品推荐
相关产品推荐

