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

时间:2018-11-02 18:31:06

标签: python pandas pivot-table multi-index subtotal

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')

enter image description here

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

任何想法都值得赞赏!谢谢。

1 个答案:

答案 0 :(得分:2)

与上一个问题非常相似的解决方案,但是您可以为缺失的水平插入空白字符串(受@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