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



我在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]"之类的东西访问数据(或者至少有这种效果的东西)。

您可以先使用replace不必要的字符串(索引必须由to_series转换为Series,因为replace还不能与index一起使用),然后使用splitrename_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

最新更新