2013-02-07 15 views
33

Ho un dataframe con un MultiIndex creato dopo qualche raggruppamento:Anteponi un livello ad un panda 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 

Come posso anteporre un livello al MultiIndex in modo che io trasformarlo in qualcosa di simile:

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 

risposta

62

è prima possibile aggiungerlo come una colonna normale e poi aggiungerlo al indice corrente, in modo da:

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

e cambiare l'ordine in caso di necessità con:

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

che si traduce in:

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

Se si esegue questa operazione con un dataframe con un indice di colonna MultiIndex, aggiunge livelli, che probabilmente non contano nella maggior parte dei casi, ma potrebbero, se si sta facendo affidamento sui metadati per qualcos'altro. – naught101

26

Un bel modo per fare questo in una sola riga usando pandas.concat():

import pandas as pd 

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

Questo può essere generalizzato su molti frame di dati, vedere docs.

+10

Ciò è particolarmente utile per aggiungere un livello alle colonne aggiungendo 'axis = 1', poiché' df.columns' non ha il metodo "set_index" come l'indice, che mi infastidisce sempre. –

+0

Questa dovrebbe essere la soluzione, grazie – jlandercy

+1

Questo è utile perché funziona anche con gli oggetti 'pd.Series', mentre la risposta attualmente accettata (dal 2013) no. – John

Problemi correlati