Разбить один уровень мультииндекса на столбцы

Так у меня есть фрейм данных:

df = pd.DataFrame([["foo","fizz",1],["foo","fizz",2],["foo","buzz",3],["foo","buzz",4],["bar","fizz",6],["bar","buzz",8]],columns=["a","b","c"])

       a    b     c
    0  foo  fizz  1
    1  foo  fizz  2
    2  foo  buzz  3
    3  foo  buzz  4
    4  bar  fizz  6
    5  bar  buzz  8

что я могу группы:

df2 = df.groupby(["a","b"]).sum()

              c
    a   b
    bar buzz  8
        fizz  6
    foo buzz  7
        fizz  3

что потрясающе! Но что мне действительно нужно, вместо столбца " c "есть два столбца:" foo "и"bar":

          foo  bar
    b
    buzz  7    8
    fizz  3    6

может кто-нибудь предложить способ сделать это? Я пробовал искать, но у меня нет правильной терминологии для этого, поэтому я ничего не мог найти.

1 ответов


вы могли бы использовать unstack для этого:

df2.unstack(level='a')

пример:

In [146]: df2.unstack(level='a')
Out[146]:
       c
a    bar foo
b
buzz   8   7
fizz   6   3

после этого вы получите колонн multiindexed. Если вам нужно получить плоский фрейм данных, вы можете использовать droplevel из multiindex:

df3 = df2.unstack(level='a')
df3.columns = df3.columns.droplevel()

In [177]: df3
Out[177]:
a     bar  foo
b
buzz    8    7
fizz    6    3

редактировать

droplevel падает уровень с MultiIndex, который ваши столбцы становятся после unstack. По умолчанию он опускает уровень 0, что вам нужно для этого фрейма данных.

копировать help(pd.core.index.MultiIndex.droplevel):

справка по функции droplevel в модуле панды.ядро.индекс:

droplevel(self, level=0) Возвращаемый индекс с запрошенным уровнем удален. Если MultiIndex имеет только 2 уровни, результат будет иметь тип индекса не MultiIndex.

Parameters
----------
level : int/level name or list thereof

Notes
-----
Does not check if result index is unique or not

Returns
-------
index : Index or MultiIndex