如何在多索引内部创建多索引,甚至有可能这样做?

时间:2018-06-27 15:07:43

标签: python python-2.7 pandas pandas-groupby

当前我有一个看起来像

的数据框
 PS        PSX1                   PSX2                   PSX3                   PSX4
      P    TEMP    Pat       P    TEMP    Pat       P    TEMP    Pat       P    TEMP    Pat 
     .01   77     IDLE      .04   77     IDLE      .003  77     IDLE      .19   77      IDLE
     .03   77     WRITE     .1    77     WRITE     .011  77     WRITE     .28   77      WRITE
     .02   77     READ      .04   77     READ      .004  77     READ      .25   77      READ
     .03   77     WRITE     .04   77     WRITE     .010  77     WRITE     .39   77      WRITE
     .02   77     READ      .04   77     READ      .195  77     READ      .24   77      READ
     .01   230    IDLE      .04   230    IDLE      .003  230    IDLE      .19   230     IDLE
     .02   230    WRITE     .1    230    WRITE     .019  230    WRITE     .29   230     WRITE
     .     .       .        .     .       .          .    .       .         .    .        .
     .     .       .        .     .       .          .    .       .         .    .        .
     .     .       .        .     .       .          .    .       .         .    .        .
     .     .       .        .     .       .          .    .       .         .    .        .

最终,数据框中的温度变为302。

我想知道是否有一种方法可以将上面的数据框更改为下面的数据框(它仍应包括PSX3和PSX4,我只是将其缩小了以便于查看)

PS             PSX1                PSX2               
TEMP     77    230   302     77    230   302    
         P      P     P      P      P     P
IDLE    .01    .01   .01    .04    .04   .04 
WRITE   .03    .02   .04    .1     .1    .2
READ    .02    .03   .03    .04    .1    .1  
WRITE   .03    .02   .02    .09    .1    .1
READ    .02    .02   .02    .1     .1    .1    

我使用这两行代码进行了第一次分组

 df1 = df1.assign(newIndex = df1.groupby('PS').cumcount())
 df1 = df1.set_index(['newIndex', 'PS']).unstack().swaplevel(0, axis = 1).sort_index(axis = 1, level = 0)

我尝试再次执行此操作,但是在1级时,我似乎无法正常工作。任何帮助将不胜感激,在此先感谢!

1 个答案:

答案 0 :(得分:2)

让我们尝试一下:

(df.stack(0)
  .set_index(['Pat','TEMP'],append=True)
  .unstack([-1,1])
  .swaplevel(0,2, axis=1)
  .sum(level=1).sort_index(axis=1))

输出:

       PSX1        PSX2         PSX3         PSX4      
TEMP    77    230   77    230    77     230   77    230
          P     P     P     P      P      P     P     P
Pat                                                    
IDLE   0.01  0.01  0.04  0.04  0.003  0.003  0.19  0.19
WRITE  0.06  0.02  0.14  0.10  0.021  0.019  0.67  0.00
READ   0.04  0.00  0.08  0.00  0.199  0.000  0.49  0.00
WRIT   0.00  0.00  0.00  0.00  0.000  0.000  0.00  0.29