如何在Pandas中实现类似Excel SUMIF的分组占比列计算
如何在Pandas中实现类似Excel SUMIF的百分比计算?
刚好处理过类似需求,用Pandas的groupby配合transform就能完美复刻Excel里SUMIF的逻辑,步骤很清晰:
首先先把你的示例数据构造出来(方便复现验证):
import pandas as pd df = pd.DataFrame({ 'pet': ['cat', 'dog', 'snek', 'cat', 'dog'], 'treats': [2, 1, 3, 6, 1], 'lbs': [5.0, 9.9, 1.1, 4.5, 9.4] })
接下来核心操作分两步:
- 第一步:按
pet分组,计算每个组的treats总和,用transform方法确保结果和原DataFrame的行数、索引完全匹配(这一步就对应Excel里SUMIF(A:A,A1,B:B)找对应组总和的逻辑) - 第二步:用每行的
treats除以对应组的总和,再乘以100得到百分比
具体代码如下:
# 计算每个宠物类型的treats总和,并广播到组内每一行 pet_total_treats = df.groupby('pet')['treats'].transform('sum') # 新增percentage列,计算百分比 df['percentage'] = (df['treats'] / pet_total_treats) * 100
运行后你会得到这样的结果:
| pet | treats | lbs | percentage | |
|---|---|---|---|---|
| 0 | cat | 2 | 5.0 | 25.0 |
| 1 | dog | 1 | 9.9 | 50.0 |
| 2 | snek | 3 | 1.1 | 100.0 |
| 3 | cat | 6 | 4.5 | 75.0 |
| 4 | dog | 1 | 9.4 | 50.0 |
如果需要控制小数位数(比如保留两位),可以加个round方法:
df['percentage'] = (df['treats'] / pet_total_treats * 100).round(2)
简单说,transform是这里的关键——它不像普通的groupby.sum()只返回每个组的单个值,而是把这个值填充到组内的每一行,这样就能和原数据的每行一一对应,完全实现你要的Excel公式效果。
内容的提问来源于stack exchange,提问作者Jackie




