为 Pandas 数据透视表 table 添加总计和小计

Add grand total and subtotal for Pandas pivot table

df=pd.DataFrame({'Region':['Oceanian','Europe','Asia','America','Europe','America','Asia','Oceanian','America'],'Country':["AU","GB","KR","US","GB","US","KR","AU","US"],'Region Manager':['TL','JS','HN','AL','JS','AL','HN','TL','AL'],'Campaign Stage':['Start','Develop','Develop','Launch','Launch','Start','Start','Launch','Develop'],'Product':['abc','bcd','efg','lkj','fsd','opi','vcx','gtp','qwe'],'Curr_Sales': [453,562,236,636,893,542,125,561,371],'Curr_Revenue':[4530,7668,5975,3568,2349,6776,3046,1111,4852],'Prior_Sales': [235,789,132,220,569,521,131,777,898],'Prior_Revenue':[1530,2668,3975,5668,6349,7776,8046,2111,9852]})
table=pd.pivot_table(df, values=['Curr_Sales', 'Curr_Revenue', 'Prior_Sales', 'Prior_Revenue'], index=['Region','Country', 'Region Manager','Campaign Stage','Product'],aggfunc='sum')

如何向每个“区域”添加小计并在底部添加总计?

如有任何想法,我们将不胜感激!谢谢。

与您之前的问题非常相似的解决方案,但是您可以为缺失的级别插入空白字符串(受@piRSquared here 启发):

out = pd.concat([d.append(d.sum().rename((k, '', '', '', 'Subtotal'))) for k, d in table.groupby('Region')]).append(table.sum().rename(('Grand', '', '', '', 'Total')))

out.index = pd.MultiIndex.from_tuples(out.index)

产量:

                                 Curr_Revenue     ...       Prior_Sales
America  US AL Develop qwe               4852     ...               898
               Launch  lkj               3568     ...               220
               Start   opi               6776     ...               521
                       Subtotal         15196     ...              1639
Asia     KR HN Develop efg               5975     ...               132
               Start   vcx               3046     ...               131
                       Subtotal          9021     ...               263
Europe   GB JS Develop bcd               7668     ...               789
               Launch  fsd               2349     ...               569
                       Subtotal         10017     ...              1358
Oceanian AU TL Launch  gtp               1111     ...               777
               Start   abc               4530     ...               235
                       Subtotal          5641     ...              1012
Grand                  Total            39875     ...              4272