首页 > 解决方案 > 数据透视表中索引的小计

问题描述

我需要数据透视表中索引PC的小计。我的输出有以下代码

data_frame1 = pd.pivot_table(data_frame, index=['PC, 'Geo', 'Comp'], values=['Bill1', 'Bill2'], columns=['Month'], fill_value=0)
data_frame1 = data_frame1.swaplevel(0,1, axis=1).sort_index(axis=1)
tuples = [(a.strftime('%b-%y'), b) if a!= 'All' else (a,b) for a,b in data_frame1.columns]
data_frame1.columns = pd.MultiIndex.from_tuples(tuples)

输出:

              jan-19               Feb-19
            Bill1 Bill2     Bill1 Bill2     
PC Geo Comp
A  Ind   OS   1     1.28        1    1.28
B  US    OP   1     1.28        1    1.28
C  Can   OV   1     1.28        1    1.28

期望的输出

               jan-19              Feb-19
            Bill1 Bill2     Bill1 Bill2     
PC Geo Comp
A  Ind   OS   1     1.28        1    1.28
       Total  1     1.28        1    1.28
B  US    OP   1     1.28        1    1.28
       Total  1     1.28        1    1.28  
C  Can   OV   1     1.28        1    1.28
       Total  1     1.28        1    1.28

data_frame1.to_excel()

标签: python-3.xpandasdataframe

解决方案


采用:

#change sample data for added 1 row for check if working sum
print (df)
            jan-19       Feb-19      
             Bill1 Bill2  Bill1 Bill2
PC Geo Comp                          
A  Ind OS        1  1.28      1  1.28
       OP        8  2.00      1  1.00
B  US  OV        1  1.28      1  1.28
C  Can OV        1  1.28      1  1.28

这是正确排序Total到每个组末尾的问题,因此将第三级转换为CategoricalIndex设置顺序 - 最后一个值为Total

lev = df.index.get_level_values(2)
cat =  lev.unique().tolist() + ['Total']

df.index = [df.index.get_level_values(0), 
            df.index.get_level_values(1), 
            pd.CategoricalIndex(lev, categories=cat, ordered=True)]

然后sum每个第一级和第二级的值 ( PC, Geo) 并将Total值添加到第三级:

df1 = df.sum(level=[0,1]).assign(name='Total').set_index('name', append=True)

然后添加到原始 byconcatDataFrame.sort_index- 因为ordered CategoricalTotal是在组的末尾:

df = pd.concat([df, df1]).sort_index()
print (df)
             jan-19       Feb-19      
              Bill1 Bill2  Bill1 Bill2
PC Geo Comp                           
A  Ind OS         1  1.28      1  1.28
       OP         8  2.00      1  1.00
       Total      9  3.28      2  2.28
B  US  OV         1  1.28      1  1.28
       Total      1  1.28      1  1.28
C  Can OV         1  1.28      1  1.28
       Total      1  1.28      1  1.28

推荐阅读