Разбить один уровень мультииндекса на столбцы
Так у меня есть фрейм данных:
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