如何在Pandas DataFrame中按条件统计列特定值的出现次数及占比
实现方案
直接用Pandas的布尔判断和聚合方法就能搞定,步骤如下:
1. 构造示例数据(方便测试)
先造个和你描述匹配的DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [0.3, 0.4, np.nan, 0.6], # 符合条件的2个,非NaN总数3,占比≈66.7% 'B': [0.2, 0.5, 0.5, 0.4, 0.7, 0.8, 0.9, 1.0], # 符合条件的4个,总数8,占比50% 'C': [0.7, 0.8, np.nan, 0.9] # 符合条件的0个,占比0%,会被排除 })
2. 统计次数和占比
# 统计每列中值≤0.5且非NaN的单元格数量 valid_counts = (df <= 0.5).sum() # 统计每列非NaN的总单元格数 total_counts = df.count() # 计算占比(转成百分比更直观) ratios = (valid_counts / total_counts) * 100 # 把结果合并成表格,方便查看 stats_df = pd.DataFrame({ '符合条件次数': valid_counts, '占比(%)': ratios.round(2) # 保留两位小数 })
运行后stats_df的结果如下:
| 列名 | 符合条件次数 | 占比(%) |
|---|---|---|
| A | 2 | 66.67 |
| B | 4 | 50.00 |
| C | 0 | 0.00 |
3. 筛选达标列
直接从统计结果里挑占比≥50%的列,再提取原DataFrame的对应列:
# 筛选占比≥50%的列名 qualified_cols = stats_df[stats_df['占比(%)'] >= 50].index # 从原DataFrame中提取这些列 filtered_df = df[qualified_cols]
最终filtered_df会只保留A、B两列,完全符合你的需求。
为啥value_counts不好用?
value_counts()是统计单个离散值的出现次数,而你的需求是统计区间范围(≤0.5)的数量,用布尔矩阵求和的方式更直接,还能自动忽略NaN值,完美匹配你的场景。
内容的提问来源于stack exchange,提问作者ArthurK
相关产品推荐
相关产品推荐

