如何在Pandas同一结果DataFrame中对不同索引层级执行groupby().sum()
解决方案
可以利用groupby.transform()方法直接生成与原DataFrame同长度的聚合结果列,无需单独计算后再合并,步骤如下:
1. 生成各层级求和列
- key1层级总和:按
key1分组后,用transform('sum')得到每个key1对应的总count,生成count_key1列 - key2层级总和:按
key1+key2组合分组后,用transform('sum')得到每组的总count,生成count_key2列
2. 调整列顺序输出
将新生成的列加入原DataFrame后,调整列的顺序至目标格式即可。
完整代码:
import pandas as pd # 原DataFrame df = pd.DataFrame({ "key1":['a','a','a','a','b','b','b','b'], "key2":[1,1,1,2,3,3,4,4], "key3":['R','S','T','U','V','W','X','Y'], "count":[10,20,10,5,12,13,8,22] }) # 生成各层级求和列 df['count_key1'] = df.groupby('key1')['count'].transform('sum') df['count_key2'] = df.groupby(['key1', 'key2'])['count'].transform('sum') # 调整列顺序到目标格式 result_df = df[['key1', 'count_key1', 'key2', 'count_key2', 'key3', 'count']] print(result_df)
执行后输出结果:
key1 count_key1 key2 count_key2 key3 count 0 a 45 1 40 R 10 1 a 45 1 40 S 20 2 a 45 1 40 T 10 3 a 45 2 5 U 5 4 b 55 3 25 V 12 5 b 55 3 25 W 13 6 b 55 4 30 X 8 7 b 55 4 30 Y 22
方法说明
transform()方法的核心作用是将聚合结果广播到原数据的每一行,保证结果列与原DataFrame长度一致,直接作为新列添加即可,避免了手动合并不同层级聚合结果的繁琐操作。
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

