我在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
一起使用),然后使用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