数据透视表中索引的小计

时间:2019-08-23 06:36:26

标签: python-3.x pandas dataframe

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

df.to_json('filename.xml', orient='split')
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

data_frame1.to_excel()

1 个答案:

答案 0 :(得分:1)

使用:

#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)]

然后在每个第一级和第二级(sumPC)中添加Geo个值,并将Total值添加到第三级:

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

然后通过concatDataFrame.sort_index添加到原始内容-因为此处ordered Categorical的{​​{1}}位于组末尾:

Total