如何统计Pandas DataFrame每行高于阈值的列数并筛选符合条件的行
问题排查与解决方法
原代码错误原因
- lambda 语法不完整:Python 单行条件表达式必须包含
if和else两个分支,你写的lambda x: x.count() if x > 2缺少else分支,直接触发语法错误 - 逻辑判断错误:
x > 2是对整行数据做比较,返回的是布尔值序列,不能直接作为if的判断条件;另外你需求是判断数值大于1,阈值写为2也不符合要求 - 统计方法错误:
x.count()是统计当前行非空值的总数,不是统计满足「数值大于1」的列数,逻辑不匹配
最优解决方案
优先使用Pandas向量化操作,比apply遍历行效率更高,不需要单独写循环判断:
1. 一步直接筛选符合要求的子集
# 直接筛选出至少2个列数值大于1的行,不需要额外新增列 filtered_df = df[(df > 1).sum(axis=1) >= 2]
2. 需要保留符合条件的列数供后续排序/分析的写法
# 新增列存储每行中数值大于1的列数 df['符合条件列数'] = (df > 1).sum(axis=1) # 再做筛选 filtered_df = df[df['符合条件列数'] >= 2]
示例运行结果
用你给出的测试数据运行后,会筛选出索引为1和4的两行,正好符合「至少2个列大于1」的要求。
apply写法的正确版本
如果你一定要用apply实现,参考以下代码:
df[9] = df.apply(lambda x: (x > 1).sum(), axis=1) filtered_df = df[df[9] >=2]
内容的提问来源于stack exchange,提问作者Dan Murphy
相关产品推荐
相关产品推荐

