Как получить доступ к столбцу MultiIndex после groupby в пандах?

В одноиндексированном фрейме данных столбцы доступны в группе по объектам:

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())

Есть ли способ получить доступ к столбцу MultiIndex в объекте groupby, который я пропустил?


person polyglot    schedule 02.08.2016    source источник
comment
Добавление запятой после вашего кортежа ('c','b'), кажется, работает: df.groupby([('c','a')])[('c','b'),].sum(). Я предполагаю, что без запятой панды просто интерпретируют их как отдельные элементы.   -  person root    schedule 02.08.2016


Ответы (2)


Добавление запятой после кортежа ('c','b') похоже работает:

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

Я предполагаю, что без запятой панды просто интерпретируют их как отдельные элементы.

person root    schedule 02.08.2016
comment
Я собираюсь отметить это как ответ, хотя это несколько неудовлетворительно и, возможно, скорее ошибка в пандах. - person polyglot; 02.08.2016

Возможно, это поможет объяснить синтаксис:

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
person Merlin    schedule 02.08.2016