首页 > 解决方案 > 在 Pandas 数据框中添加聚合/摘要行

问题描述

假设我有一个数据框如下:

df = pd.DataFrame(np.array([[2018,'R1','C1',1],[2018,'R1','C2',2],[2018,'R1','C3',3],[2018,'R1','C4',4],[2018,'R1','C5',5],[2018,'R2','C6',6],[2018,'R2','C7',7],[2018,'R2','C8',8],[2018,'R2','C9',9],[2018,'R2','C10',10]]),columns=['Year', 'Region', 'Country', 'Spend'])

我想为每个可能的group by( groups) 添加摘要行,以便输出数据框看起来像这样:

在此处输入图像描述

我已经学会了如何根据这个StackOverflow 帖子将摘要/总行添加为一列。但我想将这些总行合并到原始数据帧中,如上面的屏幕截图所示,我想用尽可能少的行来完成这一点(也就是说,避免groupby像下面那样手动调用不同的组合):

df['ByYearTotalCount'] = df.groupby(['Year'])['Spend'].transform('sum')
df['ByYearByRegionTotalCount'] = df.groupby(['Year','Region'])['Spend'].transform('sum')

谁能帮我想出最好pandas的方法来完成这个?预先感谢您的帮助!

标签: pythonpandasaggregatepandas-groupby

解决方案


用于groupby首先获取总计/小计行和concat结果数据框

df2 = df.groupby(['Year'])['Spend'].sum().reset_index()
df3 = df.groupby(['Year', 'Region'])['Spend'].sum().reset_index()
df = pd.concat([df, df2, df3], sort=False).fillna('All').sort_values(by=['Region', 'Country'])

输出

df2
   Year  Spend
0  2018     55

df3
   Year Region  Spend
0  2018     R1     15
1  2018     R2     40

df
   Year Region Country  Spend
0  2018    All     All     55
0  2018     R1     All     15
0  2018     R1      C1      1
1  2018     R1      C2      2
2  2018     R1      C3      3
3  2018     R1      C4      4
4  2018     R1      C5      5
1  2018     R2     All     40
9  2018     R2     C10     10
5  2018     R2      C6      6
6  2018     R2      C7      7
7  2018     R2      C8      8
8  2018     R2      C9      9

推荐阅读