2016-07-27 9 views
0

Konvertierung habe ich einige Daten in einem Pandas Datenrahmen, die wie folgt aussieht:einen einzigen Pandas Index in einer dreistufigen Multiindex in Python

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 

wo der linke ein Index ist. Dies ist nur ein Teilbereich der Daten, der tatsächlich viel größer ist. Der Index besteht aus drei Komponenten, Zeit, Behandlung und Dosis. Ich möchte diese Daten so reorganisieren, dass ich durch Slicing leicht darauf zugreifen kann. Der Weg dazu ist Pandas MultiIndexing, aber ich weiß nicht, wie ich meinen Dataframe mit einem Index in einen anderen mit drei konvertieren kann. Weiß jemand, wie man das macht?

Um zu verdeutlichen, ist die gewünschte Ausgabe hier die gleichen Daten mit einem dreistufigen Index, der äußere ist Behandlung, mittlere ist Dosis und die innere Zeit. Dies wäre nützlich, dann könnte ich auf die Daten mit etwas wie df['time']['dose'] oder 'df [0] `(oder etwas in diesem Sinne mindestens) zugreifen.

Antwort

1

Sie können zunächst replace unnötige Strings (Index zu Series von to_series umgewandelt werden muss, weil replace arbeitet nicht mit index noch) und dann split verwenden. Letzte eingestellte Indexnamen von rename_axis (neu in)

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 
Verwandte Themen