将多索引的一个级别拆分为列

bin*_*isb 6 python pandas

所以我有一个数据框:

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
Run Code Online (Sandbox Code Playgroud)

我可以分组:

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

              c
    a   b
    bar buzz  8
        fizz  6
    foo buzz  7
        fizz  3
Run Code Online (Sandbox Code Playgroud)

哪个太棒了!但我真正需要的不是"c"列,而是两列,"foo"和"bar":

          foo  bar
    b
    buzz  7    8
    fizz  3    6
Run Code Online (Sandbox Code Playgroud)

有人可以建议一种方法吗?我试着搜索,但我想我没有正确的术语,所以我找不到任何东西.

Ant*_*pov 5

你可以用unstack它:

df2.unstack(level='a')
Run Code Online (Sandbox Code Playgroud)

例:

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

之后,您将获得多索引列.如果你需要得到平坦的数据帧,你可以使用droplevelmultiindex:

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
Run Code Online (Sandbox Code Playgroud)

编辑

droplevel从您的列成为之后的MultiIndex中删除级别unstack.默认情况下,它会降低0级,这是该数据帧所需的.

复制自help(pd.core.index.MultiIndex.droplevel):

有关模块pandas.core.index中函数droplevel的帮助:

droplevel(self,level = 0)删除请求级别的返回索引.如果MultiIndex只有2个级别,则结果将是Index类型而不是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
Run Code Online (Sandbox Code Playgroud)