如何在pandas中groupby之后访问MultiIndex列?

时间:2016-08-02 18:23:28

标签: python pandas grouping multi-index

使用单索引数据框,列可按对象分组:

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

a
2    11
4    15

但是在不按级别分组的MultiIndex数据框中,不再可以按对象分组访问列

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'"

作为一种解决方法,这可行,但由于它没有使用cpythonized聚合器,因此效率不高,更不用说它看起来很尴尬了。

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

有没有办法在我错过的groupby对象中访问MultiIndex列?

2 个答案:

答案 0 :(得分:4)

('c','b')元组之后添加逗号似乎有效:

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

我猜测,如果没有逗号,大熊猫只是将它们解释为单独的项目。

答案 1 :(得分:0)

也许这有助于解释语法:

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