2016-08-19 1 views
9

Ich habe einen Datenrahmen mit mehreren Ebenen, zB:Pandas: get Multiindex Ebene als Serie

idx = pd.MultiIndex.from_product((['foo', 'bar'], ['one', 'five', 'three' 'four']), 
           names=['first', 'second']) 
df = pd.DataFrame({'A': [np.nan, 12, np.nan, 11, 16, 12, 11, np.nan]}, index=idx).dropna().astype(int) 

       A  
first second 
foo five  12 
     four  11 
bar one  16 
     five  12 
     three 11 

Ich möchte eine neue Spalte mit der Indexebene second Titel erstellen, so dass ich

   A B 
first second 
foo five  12 five 
     four  11 four 
bar one  16 one 
     five  12 five 
     three 11 three 
erhalten

Ich kann dies tun, indem Sie den Index zurücksetzen, die Spalte kopieren und erneut anwenden, aber das scheint mehr Runde.

Ich versuchte df.index.levels[1], aber das erstellt eine sortierte Liste, es behält nicht die Reihenfolge.

Wenn es ein einzelner Index wäre, würde ich df.index aber in einem Multiindex verwenden, der eine Spalte von Tupeln erstellt.

Wenn dies an anderer Stelle gelöst wird, teilen Sie bitte, da ich Glück gehabt habe, die Stackoverflow-Archive zu durchsuchen.

Antwort

10
df['B'] = df.index.get_level_values(level=1) # Zero based indexing. 
# df['B'] = df.index.get_level_values(level='second') # This also works. 
>>> df 
       A  B 
first second   
foo one  12 one 
     two  11 two 
bar one  16 one 
     two  12 two 
     three 11 three 
+0

ist es möglich, durch Indexnamen zu tun? –

+1

Ja. 'df.index.get_level_values ​​(level = 'second')' funktioniert auch. – Alexander

+1

Sie können dasselbe tun, wenn der Multiindex über den Spalten und nicht über den Index liegt, indem Sie 'df.columns.get_level_values ​​(level = 1)' verwenden. –

3
df['B'] = idx.to_series().str[1]