Pandas保留所有行前提下按条件计算分组占比的实现问题
解决方法
你原来的代码存在三个核心问题:
- 语法错误:
groupby(['index', 'Col1']后缺少闭合的方括号,运行会直接报错 - 分组键设置错误:需求是仅按
Col1分组计算占比,你额外加了index作为分组键,会导致每个分组仅包含1行数据,计算结果不符合预期 - 方法选择错误:
apply会对每个分组返回聚合后的单行结果,直接赋值会覆盖原有DataFrame的结构,导致丢失列和行;应该使用transform方法,它会把分组计算结果广播到分组内的所有行,完全保留原有行数和列。
正确实现代码
import pandas as pd # 业务需要的排序逻辑可保留 df = df.sort_values(['index', 'Col1'], ascending=(True, True)) # 核心计算逻辑:按Col1分组,计算Col9>50的行占比,广播到同组所有行 # 布尔值True等价于1、False等价于0,均值就是符合条件的占比,乘以100转为百分比 df['Percentual'] = df.groupby('Col1')['Col9'].transform(lambda x: (x > 50).mean() * 100) # 如果需要带%符号的字符串格式,可新增以下代码 # df['Percentual'] = df['Percentual'].apply(lambda x: f"{x:.0f}%")
效果验证
用你给出的示例场景测试,输出结果如下:
| index | Col1 | Col9 | Percentual |
|---|---|---|---|
| 1 | a | 60 | 50.0 |
| 2 | a | 40 | 50.0 |
| 3 | b | 30 | 0.0 |
| 4 | b | 20 | 0.0 |
| 5 | c | 70 | 25.0 |
| 6 | c | 40 | 25.0 |
| 7 | c | 30 | 25.0 |
| 8 | c | 10 | 25.0 |
完全符合需求:原有所有行和列都保留,同组Percentual值一致。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

