2013-02-07 47 views
33

我有一個多指標一個數據幀的一些分組之後創建的:前面加上一個級別的大熊貓多指標

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 

我如何在前面加上一個級別的多指標,讓我把它變成類似:

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 

回答

62

您可以將它添加作爲一個正常的列,然後將其附加到當前指數,所以:

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

,如果需要與更改順序:

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

導致:

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

如果使用具有MultiIndex列索引的數據框執行此操作,它會添加級別,在大多數情況下這可能無關緊要,但如果您依賴其他元數據的元數據,則可能會這樣。 – naught101

26

一個很好的方式,在一行做到這一點使用pandas.concat()

import pandas as pd 

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

這可以推廣到很多數據幀,請參閱docs

+10

由於'df.columns'沒有像索引這樣的「set_index」方法,總是讓我感到困惑,所以通過添加'axis = 1'來爲列添加一個級別是非常好的。 –

+0

這應該是解決方案,謝謝 – jlandercy

+1

這很好,因爲它也適用於'pd.Series'對象,而目前接受的答案(從2013年)不適用。 – John