熊猫枢轴列顺序多个agg

时间:2019-02-26 15:51:48

标签: python pandas dataframe

我有一个像这样的数据框(示例)

import pandas as pd
df = pd.DataFrame({'m': [101, 102, 106, 107, 109, 114, 115, 115, 119, 121, 123, 124, 124, 124, 128, 130, 130, 133, 137, 140],
                   'o': [103132, 103297, 102485, 106034, 109479, 101807, 106092, 101948, 100192, 105655, 104533, 107595, 109580, 104427, 110054, 106281, 102007, 104165, 109145, 108300],
                   'code': [307, 308, 306, 307, 306, 306, 307, 307, 306, 307, 303, 308, 307, 307, 307, 306, 307, 304, 308, 309],
                   'time': [105.5, 50.1, 15.52, 224.32, 10.3, 30.4, 170.9, 140.6, 17.6, 180.9, 45.05, 395.2, 120.9, 200.8, 225.0, 30.9, 180.9, 25.5, 15.3, 100.4]
                  })

我想将mcode分组,而countsum的值time

我有这个,因为代码需要是一列

pd.pivot_table(
     df,
     index=['m'],
     columns=['code'],
     aggfunc={"time":['sum','size']},
     fill_value=0
)

此返回此

        time
        size                    sum
code    303 304 306 307 308 309 303     304     306     307     308     309
m                                               
101     0   0   0   1   0   0   0.00    0.0     0.00    105.50  0.0     0.0
102     0   0   0   0   1   0   0.00    0.0     0.00    0.00    50.1    0.0
106     0   0   1   0   0   0   0.00    0.0     15.52   0.00    0.0     0.0
107     0   0   0   1   0   0   0.00    0.0     0.00    224.32  0.0     0.0
109     0   0   1   0   0   0   0.00    0.0     10.30   0.00    0.0     0.0
114     0   0   1   0   0   0   0.00    0.0     30.40   0.00    0.0     0.0
115     0   0   0   2   0   0   0.00    0.0     0.00    311.50  0.0     0.0
119     0   0   1   0   0   0   0.00    0.0     17.60   0.00    0.0     0.0
121     0   0   0   1   0   0   0.00    0.0     0.00    180.90  0.0     0.0
123     1   0   0   0   0   0   45.05   0.0     0.00    0.00    0.0     0.0
124     0   0   0   2   1   0   0.00    0.0     0.00    321.70  395.2   0.0
128     0   0   0   1   0   0   0.00    0.0     0.00    225.00  0.0     0.0
130     0   0   1   1   0   0   0.00    0.0     30.90   180.90  0.0     0.0
133     0   1   0   0   0   0   0.00    25.5    0.00    0.00    0.0     0.0
137     0   0   0   0   1   0   0.00    0.0     0.00    0.00    15.3    0.0
140     0   0   0   0   0   1   0.00    0.0     0.00    0.00    0.0     100.4

但是我希望两列具有相同的code ,没有一个具有size值的部分,而没有一个具有sum值的部分

例如,这个

        time
        303      304      306      307         308      309
code    sum size sum size sum size sum    size sum size sum size 
m                                               
101     0.00 0   0.00 0   0.00 0   105.50 1    0.00 0   0.00 0
102     0.00 0   0.00 0   0.00 0   0.00   0    50.1 1   0.00 0  

我认为可以反转列索引,但是不知道

1 个答案:

答案 0 :(得分:1)

使用swaplevel + sort_index

pd.pivot_table(
     df,
     index=['m'],
     columns=['code'],
     aggfunc={"time":['sum','size']},
     fill_value=0
).swaplevel(2,1,axis=1).sort_index(level=[0,1],axis=1)