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

Converting a single pandas index into a three level MultiIndex in python

我在 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 unnecessary strings (index has to be converted to Series by to_series, because replace doesnt work with index yet) and then use split. Last set index names by rename_axispandas0.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