2016-08-19 21 views
9

Mam dataframe z wieloma poziomami, npPandy: uzyskać poziom multiindex jak seria

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 

Chcę utworzyć nową kolumnę używając poziom indeksu pt second, tak aby uzyskać

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

Mogę to zrobić, resetując indeks, kopiując kolumnę, a następnie ponownie aplikując, ale to wydaje się bardziej okrągłe.

Próbowałem df.index.levels[1], ale to tworzy posortowaną listę, nie zachowuje zamówienia.

Jeśli był to pojedynczy indeks, użyłbym df.index, ale w multiindeksie, który tworzy kolumnę krotek.

Jeśli zostanie to rozwiązane w innym miejscu, proszę udostępnić, ponieważ nie miałem szczęścia szukając archiwów stackoverflow.

Odpowiedz

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

jest to możliwe do zrobienia wg nazwy indeksu? –

+1

Tak. 'df.index.get_level_values ​​(level = 'second')' również działa. – Alexander

+1

Możesz zrobić to samo, jeśli multiindeks znajduje się nad kolumnami, a nie w indeksie, używając 'df.columns.get_level_values ​​(level = 1)'. –

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