2013-02-07 3 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) 

とし、必要に応じて順序を変更します。

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

マルチインデックスインデックスを持つデータフレームでこれを行うと、レベルが追加されます。これはほとんどの場合重要ではないかもしれませんが、他のもののメタデータに頼っている場合はそうかもしれません。 – naught101

26

pandas.concat()を使用して1行でこれを行うには良い方法:これは一般化することができる

import pandas as pd 

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

を、その結果

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

多くのデータフレームについては、docsを参照してください。

+10

'df.columns'はインデックスのような" set_index "メソッドを持っていないので、' axis = 1'を追加することでカラムにレベルを追加するのは特に便利です。 –

+0

これは解決策になります。 – jlandercy

+1

これは 'pd.Series'オブジェクトに対しても機能するので、これはいいですが、現在受け入れられている回答(2013年以降)はそうではありません。 – John

関連する問題