在 Pandas 系列中对多级索引级别求和

50

我想在一个具有3级多索引的系列中对一级进行求和(边缘化),以产生一个具有2级多索引的系列。例如,如果我有以下内容:

ind = [tuple(x) for x in ['ABC', 'ABc', 'AbC', 'Abc', 'aBC', 'aBc', 'abC', 'abc']]
mi = pd.MultiIndex.from_tuples(ind)
data = pd.Series([264, 13, 29, 8, 152, 7, 15, 1], index=mi)

A  B  C    264
      c     13
   b  C     29
      c      8
a  B  C    152
      c      7
   b  C     15
      c      1

我想对变量 C 进行求和,以产生以下输出:
A  B    277
   b     37
a  B    159
   b     16

在Pandas中,最好的方法是什么?
2个回答

63

如果您知道您总是想聚合前两个级别,那么这很容易:

In [27]: data.groupby(level=[0, 1]).sum()
Out[27]:
A  B    277
   b     37
a  B    159
   b     16
dtype: int64

2
如何将级别名称合并为列/索引名称? - denfromufa
2
与此同时,自从@Jeff的评论以来,df.sum(level=...)已经被弃用,并发出警告,表明df.groupby(levels=...).sum()是正确的方法。 - Antimon
@Jeff,请将您的评论放在适当的答案中,这样人们就可以点赞它并使其成为佼佼者。 - Philipp

0
另一个可能性是将该 Series 转换为 dataframe,并横向进行 sum,可以使用 unstack函数实现。
data.unstack().sum(axis=1)


A  B    277
   b     37
a  B    159
   b     16
dtype: int64

unstack 的级别必须是要被求和的值的级别。例如,以下两个示例是等效的。

x = data.unstack(level=0).sum(axis=1)
y = data.groupby(level=[1,2]).sum()

x.equals(y) # True

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