2013-02-07 15 views
33

Mam DataFrame z MultiIndex utworzony po jakimś ugrupowaniu:Prepend poziom do pand MultiIndex

import numpy as np 
import pandas as p 
from numpy.random import randn 

df = p.DataFrame({ 
    'A' : ['a1', 'a1', 'a2', 'a3'] 
    , 'B' : ['b1', 'b2', 'b3', 'b4'] 
    , 'Vals' : randn(4) 
}).groupby(['A', 'B']).sum() 

df 

Output>   Vals 
Output> A B   
Output> a1 b1 -1.632460 
Output> b2 0.596027 
Output> a2 b3 -0.619130 
Output> a3 b4 -0.002009 

Jak poprzedzić poziom do MultiIndex abym przekształcić go w coś takiego:

Output>      Vals 
Output> FirstLevel A B   
Output> Foo  a1 b1 -1.632460 
Output>    b2 0.596027 
Output>   a2 b3 -0.619130 
Output>   a3 b4 -0.002009 

Odpowiedz

62

można najpierw dodać go jako normalną kolumnę, a następnie dołączyć go do aktualnego indeksu, więc:

df['Firstlevel'] = 'Foo' 
df.set_index('Firstlevel', append=True, inplace=True) 

i zmienić kolejność w razie potrzeby z:

df.reorder_levels(['Firstlevel', 'A', 'B']) 

co skutkuje:

     Vals 
Firstlevel A B   
Foo  a1 b1 0.871563 
       b2 0.494001 
      a2 b3 -0.167811 
      a3 b4 -1.353409 
+1

Jeśli zrobisz to z ramką danych z indeksem kolumny MultiIndex, doda ona poziomy, co prawdopodobnie w większości przypadków nie ma znaczenia, ale może, jeśli bazujesz na metadanych dla czegoś innego. – naught101

26

dobry sposób, aby zrobić to w jednym wierszu używając pandas.concat():

import pandas as pd 

pd.concat([df], keys=['Foo'], names=['Firstlevel']) 

to można uogólnić do wielu ramek danych, patrz docs.

+10

To jest szczególnie miłe dla dodawania poziomu do kolumn przez dodanie 'axis = 1', ponieważ' df.columns' nie ma metody "set_index" jak indeks, który zawsze mnie budzi. –

+0

To powinno być rozwiązanie, dziękuję – jlandercy

+1

To jest miłe, ponieważ działa również dla obiektów 'pd.Series', podczas gdy obecnie zaakceptowana odpowiedź (od 2013) nie. – John

Powiązane problemy