在多索引数据帧上使用 groupby/apply 时索引级别加倍

Dan*_*ung 11 python pandas

在 a 上使用groupby/apply链时遇到问题MultiIndex DataFrame:生成的数据框包含两次分组级别!

示例数据框:

df = pandas.DataFrame(dict(a=[1, 2, 3, 4, 5, 6], b=[6, 7, 8, 9, 0, 0]),
                      index=pandas.MultiIndex.from_product([[1, 2], [3, 4, 5]]))

     a  b
1 3  1  6
  4  2  7
  5  3  8
2 3  4  9
  4  5  0
  5  6  0
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我只是对行求和(我实际上有另一个函数,但它也接受并返回一个数据帧):

df.groupby(level=0).apply(lambda x: x.sum(axis=1))
Run Code Online (Sandbox Code Playgroud)

它给了我以下结果:

1  1  3     7
      4     9
      5    11
2  2  3    13
      4     5
      5     6
dtype: int64
Run Code Online (Sandbox Code Playgroud)

所以现在我有三个索引级别,其中一个按加倍分组。当我按两个级别分组时,整个多索引翻了一番:

df.groupby(level=[0,1]).apply(lambda x: x.sum(axis=1))

1  3  1  3     7
   4  1  4     9
   5  1  5    11
2  3  2  3    13
   4  2  4     5
   5  2  5     6
dtype: int64
Run Code Online (Sandbox Code Playgroud)

如果我设置as_index=False,我仍然会得到另一个索引级别,包含升序数字:

df.groupby(level=[0,1], as_index=False).apply(lambda x: x.sum(axis=1))

0  1  3     7
1  1  4     9
2  1  5    11
3  2  3    13
4  2  4     5
5  2  5     6
dtype: int64
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?如何避免创建另一个索引级别?每次执行 groupby/apply 操作时都必须手动删除它吗?

Ste*_*fan 11

还有一个group_keys选项,它只留下应用到各个块MultiIndexSeries返回的.sum(axis=1)

df = pandas.DataFrame(dict(a=[1, 2, 3, 4, 5, 6], b=[6, 7, 8, 9, 0, 0]),
                  index=pandas.MultiIndex.from_product([[1, 2], [3, 4, 5]]))

print(df.groupby(level=0, group_keys=False).apply(lambda x: x.sum(axis=1)))

1  3     7
   4     9
   5    11
2  3    13
   4     5
   5     6
dtype: int64
Run Code Online (Sandbox Code Playgroud)