本文介绍如何在 pandas 中简洁、高效地统计指定多列中大于 0 的列数量,并仅保留该计数值大于 1 的行,避免冗余中间列和多步操作。
本文介绍如何在 pandas 中简洁、高效地统计指定多列中大于 0 的列数量,并仅保留该计数值大于 1 的行,避免冗余中间列和多步操作。
在数据清洗与条件筛选任务中,常需判断某一行中多个目标列有多少个满足特定条件(如 > 0),再基于该“满足条件的列数”进行过滤。例如,对 colB、colC、colD、colE 四列,统计每行中值大于 0 的列个数,仅保留个数 > 1 的行——这无需创建临时计数列、也不必分三步处理,一行布尔索引即可优雅实现。
核心思路是:
- 按列名列表选取目标列:df[['colB','colC','colD','colE']];
- 逐元素比较生成布尔矩阵:.gt(0) 或 > 0,结果为 True/False DataFrame;
- 按行求和(axis=1):每个 True 被当作 1 计入,即得每行满足条件的列数;
- 二次布尔索引:.sum(axis=1) > 1 生成长度匹配的布尔 Series,直接用于行过滤。
✅ 推荐写法(清晰、可读性强):
filtered_df = df[(df[['colB', 'colC', 'colD', 'colE']] > 0).sum(axis=1) > 1]
✅ 等价写法(显式调用方法,语义更明确):
filtered_df = df[df[['colB', 'colC', 'colD', 'colE']].gt(0).sum(axis=1) > 1]
以原始数据为例:
import pandas as pd
df = pd.DataFrame({
'colA': [1105, 1106, 1107, 1110, 1019, 1267],
'colB': [0.00, 3.00, 0.50, 0.00, 9.00, 0.00],
'colC': [867, 3.22, 0.00, 23.00, 0.00, 0.00],
'colD': [3.4, 1.00, 0.00, 0.00, 2.00, 0.00],
'colE': [0.00, 3.00, 1.00, 0.00, 0.00, 2.00],
'colF': ['text1', 'text2', 'text3', 'text4', 'text5', 'text6']
})
执行后输出:
colA colB colC colD colE colF 0 1105 0.0 867.00 3.4 0.0 text1 1 1106 3.0 3.22 1.0 3.0 text2 2 1107 0.5 0.00 0.0 1.0 text3 4 1019 9.0 0.00 2.0 0.0 text5
? 关键中间步骤解析(便于调试与理解):
- df[['colB','colC','colD','colE']] > 0 → 返回布尔 DataFrame;
- .sum(axis=1) → 每行 True 计数,得到 pd.Series([2,4,2,1,2,1]);
- > 1 → 转为布尔索引 [True,True,True,False,True,False]。
⚠️ 注意事项:
- sum() 在布尔型 DataFrame/Series 上默认将 True→1, False→0,无需额外转换;
- axis=1 表示跨列求和(即按行汇总),切勿遗漏或误写为 axis=0;
- 此方法天然支持任意数量的目标列,扩展性极强(如新增 colG 只需加入列名列表);
- 若需统计 >= 0、!= 0 或其他条件,仅需替换 > 0 为对应表达式(如 != 0 或 ge(0))。
该方案兼具简洁性、性能与可维护性,是 Pandas 布尔索引与向量化运算的典型实践,推荐作为多列条件计数筛选的标准写法。











