Pandas Pivot Table- aggfunc来获取多指数的小计?

时间:2017-12-05 00:52:27

标签: python pandas pivot

我有一个简单的数据框,其中包含我需要在大陆上分组的索引:

 country   continent   value1   value2   value3  
 uk        eu               1        9        2  
 us        na               8       39        0  
 spain     eu               3        9        0  
 mexico    na               2        7        8  
 japan     asia             9        9        2  
 china     asia             2        8        6  

我要做的就是创建一个为大洲创建行的数据框,并将其小计作为值合并,然后在末尾添加Grand total并合并每列的总计。

 Row Labels    Sum of value1   Sum of value2   Sum of value3  
 asia                     11              17               8  
 china                     2               8               6  
 japan                     9               9               2  
 eu                        4              18               2  
 spain                     3               9               0  
 uk                        1               9               2  
 na                       10              46               8  
 mexico                    2               7               8  
 us                        8              39               0  
 Grand Total              25              81              18  

这是我的代码,由于某些原因,我只能使用aggfunc获得总计,而不是小计。

pd.pivot_table(mergedcpt, index=['continent','spread_Bucket'],aggfunc=np.sum, margins=True)


  eu      uk     1    9    2   
          us        8   39    0  
  na     spain     3    9    0  
         mexico    2    7    8  
  asia   japan     9    9    2  
         china     2    8    6  
  all             25   81   18  

我错了什么?感谢帮助 - 我知道以前的熊猫版本包含了你可以聚合的行,但我不知道如何在新版本中执行此操作。感谢帮助。

1 个答案:

答案 0 :(得分:1)

对于你想要做的事情,没有快速的单行代码。您可以通过在大洲上进行分组来创建新数据框,附加原始数据框,然后对值进行排序以获得所需的顺序。

import pandas as pd

df = pd.DataFrame(
    {'continent': ['eu', 'na', 'eu', 'na', 'asia', 'asia'],
     'country': ['uk', 'us', 'spain', 'mexico', 'japan', 'china'],
     'value1': [1, 8, 3, 2, 9, 2],
     'value2': [9, 39, 9, 7, 9, 8],
     'value3': [2, 0, 0, 8, 2, 6]})

g = df.groupby(['continent','continent']).sum()
g.index.set_names('Row Label', level=-1, inplace=True)
gt = pd.DataFrame([g.sum()], columns=g.columns,
    index=pd.MultiIndex.from_tuples([('~','Grand Total')]))
df2 = g.append(gt).reset_index()
out = ( df2.append(df.rename(columns={'country': 'Row Label'})
                     .sort_values(['continent', 'Row Label']))
           .sort_values('continent')
           .drop('continent', axis=1)
           .rename(columns={'value1': 'Sum of value1',
                            'value2': 'Sum of value2',
                            'value3': 'Sum of value3'})
           .reset_index(drop=True) )
out
# returns:
     Row Label  Sum of value1  Sum of value2  Sum of value3
0         asia             11             17              8
1        china              2              8              6
2        japan              9              9              2
3           eu              4             18              2
4        spain              3              9              0
5           uk              1              9              2
6           na             10             46              8
7       mexico              2              7              8
8           us              8             39              0
9  Grand Total             25             81             18