2016-08-02 3 views
4

、列はオブジェクトによってグループ内に用意されていますパンダでgroupbyの後にMultiIndex列にアクセスするには?単一インデックスデータフレームで

df1 = pd.DataFrame({'a':[2,2,4,4], 'b': [5,6,7,8]}) 
df1.groupby('a')['b'].sum() -> 

a 
2 11 
4 15 

しかし、マルチインデックスのデータフレームにレベルによってグループ化していないとき、列はオブジェクト

によってグループにアクセスできなくなります
df = pd.concat([df1, df1], keys=['c', 'd'], axis=1) 
df -> 

    c  d 
    a b a b 
0 2 5 2 5 
1 2 6 2 6 
2 4 7 4 7 
3 4 8 4 8 

df.groupby([('c','a')])[('c','b')].sum() -> 
KeyError: "Columns not found: 'b', 'c'" 

回避策として、これはうまくいきますが、cpython化されたアグリゲータを使用していないので効率的ではありません。

df.groupby([('c','a')]).apply(lambda df: df[('c', 'b')].sum()) 

私が逃したgroupbyオブジェクトのMultiIndex列にアクセスする方法はありますか?私はカンマなしで、パンダはちょうど別の項目としてそれらを解釈していることを推測している

df.groupby([('c','a')])[('c','b'),].sum() 

+3

はカンマを追加しますa ')])[(' c '、' b ')、]。sum() '。私はカンマがなければ、パンダはちょうど別々のアイテムとしてそれらを解釈していると思います。 – root

答えて

3

あなた('c','b')タプルの後にコンマを追加するには、動作するようです。

+0

私は答えとしてマークするつもりですが、多少不満足で、パンダのバグが多いかもしれません。 – polyglot

0

多分これは、構文の説明に役立ちます: `df.groupby([( 'C'、」:あなたの`( 'C'、 'B')は `タプルが動作しているようです後

df.groupby([('c','a')]).sum() 

     c d  
     b a b 
(c, a)   
2  11 4 11 
4  15 8 15 

df.groupby([('c','a')])[('c','b'),('d','b')].sum() 

     c d 
     b b 
(c, a)   
2  11 11 
4  15 15 
関連する問題