2016-02-16 1 views
6

У меня есть мультииндексированное pandas.Dataframe который что-то вроде этого:свопа уровня один из индекса с уровнем столбца (Панды мультииндексных Dataframe)

  BAZ PAL 
Foo Bar   
124 1 A  B 
     2 C  D 
134 1 E  F 
     2 G  H 

мне нужно поменять уровень один из индекса с колоннами в соответствующем путь. Мне нужно, чтобы в конечном итоге с чем-то вроде этого:

  124 134 
Coo Bar 
BAZ 1 A E 
    2 C G 
PAL 1 B F 
    2 D H 

ответ

2

Вы должны поместить значение существующий уровень индекса Foo, складывают нужную колонку «COO», а затем переставить уровни индекса. После обмена индексами вы, вероятно, захотите его отсортировать. Как последний штрих, вы можете удалить имя столбца всех значений (val).

df = (pd.DataFrame({'Foo': [124, 124, 134, 134] * 2, 
        'Bar': [1, 2, 1, 2] * 2, 
        'Coo': ['BAZ'] * 4 + ['PAL'] * 4, 
        'val': list('ACEGBDFH')}) 
     .set_index(['Foo', 'Bar', 'Coo']) 
     .unstack('Coo')) 

>>> df 
     val  
Coo  BAZ PAL 
Foo Bar   
124 1  A B 
    2  C D 
134 1  E F 
    2  G H 

df = df.unstack('Foo').stack('Coo') 
df.index = df.index.swaplevel(0, 1) 

>>> df 
     val  
Foo  124 134 
Coo Bar   
BAZ 1  A E 
PAL 1  B F 
BAZ 2  C G 
PAL 2  D H 

df.sort_index(inplace=True) 

>>> df 
     val  
Foo  124 134 
Coo Bar   
BAZ 1  A E 
    2  C G 
PAL 1  B F 
    2  D H 

df.columns = df.columns.droplevel() 

>>> df 
Foo  124 134 
Coo Bar   
BAZ 1  A E 
    2  C G 
PAL 1  B F 
    2  D H 
+0

спасибо. Это полностью сработало. –

+0

Рад помочь. – Alexander

Смежные вопросы