在python中将单个pandas索引转换为三级MultiIndex

时间:2016-07-27 13:40:58

标签: python pandas indexing multi-index

我在pandas数据框中有一些数据,如下所示:

gene                                  VIM  
time:2|treatment:TGFb|dose:0.1  -0.158406  
time:2|treatment:TGFb|dose:1     0.039158  
time:2|treatment:TGFb|dose:10   -0.052608  
time:24|treatment:TGFb|dose:0.1  0.157153  
time:24|treatment:TGFb|dose:1    0.206030  
time:24|treatment:TGFb|dose:10   0.132580  
time:48|treatment:TGFb|dose:0.1 -0.144209  
time:48|treatment:TGFb|dose:1   -0.093910  
time:48|treatment:TGFb|dose:10  -0.166819  
time:6|treatment:TGFb|dose:0.1   0.097548  
time:6|treatment:TGFb|dose:1     0.026664  
time:6|treatment:TGFb|dose:10   -0.008032  

其中左边是索引。这只是数据的一个小节,实际上要大得多。该指数由三个部分组成,时间,治疗和剂量。我想重新组织这些数据,以便我可以通过切片轻松访问它。这样做的方法是使用pandas MultiIndexing,但我不知道如何将我的DataFrame与一个索引转换为另一个索引。有人知道怎么做这个吗?

为了澄清,这里所需的输出是具有三级指数的相同数据,外部是治疗,中间是剂量,内部是时间。这将是有用的,因此我可以使用类似df['time']['dose']或' df [0]`(或至少具有该效果的东西)来访问数据。

1 个答案:

答案 0 :(得分:1)

您可以先replace个不必要的字符串(索引必须to_series转换为Series,因为replace尚未与index合作,然后使用split。最后设置的索引名称由rename_axis设置(pandas 0.18.0中的新内容)

df.index = df.index.to_series().replace({'time:':'','treatment:': '','dose:':''}, regex=True)
df.index = df.index.str.split('|', expand=True)
df = df.rename_axis(('time','treatment','dose'))

print (df)
                          VIM
time treatment dose          
2    TGFb      0.1  -0.158406
               1     0.039158
               10   -0.052608
24   TGFb      0.1   0.157153
               1     0.206030
               10    0.132580
48   TGFb      0.1  -0.144209
               1    -0.093910
               10   -0.166819
6    TGFb      0.1   0.097548
               1     0.026664
               10   -0.008032