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

16

所以我有一个数据框:

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
尝试使用df2.unstack(level='a') - Anton Protopopov
1个回答

14
您可以使用 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

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) 中复制:

Help on function droplevel in module pandas.core.index:

droplevel(self, level=0) Return Index with requested level removed. If MultiIndex has only 2 levels, the result will be of Index type not 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

正是我需要的 :) 你能解释一下droplevel()函数的作用吗? - binnisb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接