基于分组列统计指定列中大于0值的行数问题求助
分组统计指定列中满足条件的行数解决方案
示例数据集
Col1 Col2 Col3 A 100 100 A 0 0 A 0 100 B 100 0 C 100 100 C 100 100
需求
按Col1的A/B/C分组,统计Col2和Col3中值为100(或大于0)的行数,得到如下结果:
Col2_counts Col3_counts Col1 A 1 2 B 1 0 C 2 2
错误原因分析
你之前使用的df.groupby(['Col1', 'Col2', 'Col3']).transform('count')无法得到预期结果,问题在于:
- 同时按三列分组,会将
Col2/Col3的不同值拆分为独立子组,无法实现按Col1统一聚合的目标 transform('count')返回与原数据集行数一致的结果,而非每个Col1分组的汇总统计值
正确实现代码
1. 构造示例DataFrame
import pandas as pd data = { 'Col1': ['A', 'A', 'A', 'B', 'C', 'C'], 'Col2': [100, 0, 0, 100, 100, 100], 'Col3': [100, 0, 100, 0, 100, 100] } df = pd.DataFrame(data)
2. 统计值为100的行数
利用布尔值求和(True对应1,False对应0)的特性,直接统计分组内满足条件的行数:
# 按Col1分组,聚合统计指定列的符合条件行数 result = df.groupby('Col1').agg( Col2_counts=('Col2', lambda x: (x == 100).sum()), Col3_counts=('Col3', lambda x: (x == 100).sum()) ).set_index('Col1') print(result)
3. 扩展:统计大于0的行数
只需修改lambda中的条件即可:
result_gt0 = df.groupby('Col1').agg( Col2_counts=('Col2', lambda x: (x > 0).sum()), Col3_counts=('Col3', lambda x: (x > 0).sum()) ).set_index('Col1')
后续扩展(可选)
如果需要计算占比,比如Col2的满足条件行数占该分组总行数的比例,可以在聚合时同时统计总行数:
ratio_result = df.groupby('Col1').agg( Col2_counts=('Col2', lambda x: (x == 100).sum()), Col2_total=('Col2', 'count'), Col3_counts=('Col3', lambda x: (x == 100).sum()), Col3_total=('Col3', 'count') ).assign( Col2_ratio=lambda x: x['Col2_counts'] / x['Col2_total'], Col3_ratio=lambda x: x['Col3_counts'] / x['Col3_total'] ).set_index('Col1')
内容的提问来源于stack exchange,提问作者kiwi_kimchi
相关产品推荐
相关产品推荐

