在pandas系列中对多重索引层求和

51 投票
2 回答
40963 浏览
提问于 2025-04-18 13:50

我想要在一个有三层索引的序列中,对其中一层进行求和(也就是边际化),这样就能得到一个只有两层索引的序列。比如说,如果我有以下内容:

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 个回答

0

另一种可能性是将这个序列(Series)转换成一个数据框(dataframe),然后进行横向求和。

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
64

如果你知道自己总是想要对前两个层级进行汇总,那这就很简单了:

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

撰写回答