使用单索引数据框,列可按对象分组:
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列?
答案 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