所以我有一个数据框:
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
有人可以建议一种方法吗?我试过搜索,但我想我没有正确的术语,所以我找不到任何东西。
答案 0 :(得分:5)
您可以使用unstack
:
df2.unstack(level='a')
示例:
In [146]: df2.unstack(level='a')
Out[146]:
c
a bar foo
b
buzz 8 7
fizz 6 3
之后,您将获得多索引列。如果您需要获得平坦的数据帧,可以使用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
从您的列变为unstack
之后的MultiIndex中删除级别。默认情况下,它会降低0级,这是该数据帧所需的。
从help(pd.core.index.MultiIndex.droplevel)
复制:
模块pandas.core.index中的函数 droplevel 的帮助:
droplevel (自我,等级= 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