对多索引熊猫系列中的重复行求和,并为缺失的类别插入零

时间:2018-12-23 17:48:19

标签: python python-3.x pandas dataframe multi-index

这个问题与这里的问题非常相似:

Sum duplicated rows on a multi-index pandas dataframe

除了适用于Pandas系列,不是Pandas DataFrame,并且针对DataFrame给出和接受的答案不适用于我的系列。

说我有一个名为s的多索引pd.Series,像这样:

                  volume1  
year   product
2010   A          10         
       A          7          
       B          7          
2011   A          10         
       B          7          
       C          5     

预期产量:如果给定年份有重复的产品,我们将其相加。但是对于每年缺少的类别,我想将sm记录为“ 0”。因此,类似以下的Pandas Series就像我希望输出看起来像这样:

              volume1
year product         
2010 A             17
     B              7
     C              0
2011 A             10
     B              7
     C              5

我尝试了链接到该问题的所有答案,解释了如何针对pd.DataFrame执行此操作,例如:

s = s.sum(level=[0,1]).unstack(fill_value=0).stack()

s = s.sum(level=[0,1]).unstack().stack(dropna=False)

但是这些都不起作用,而且似乎只是用NaN值填充整个系列。这真令人沮丧,而且必须有一个我找不到的快速修复。谢谢。

2 个答案:

答案 0 :(得分:1)

我认为您正在寻求倒数第二个unstack

s.sum(level=[0, 1]).unstack(1, fill_value=0).stack()

              volume1
year product         
2010 A             17
     B              7
     C              0
2011 A             10
     B              7
     C              5

另一种选择是将第一级转换为分类级别,然后不需要拆栈(效率低下)。

df.index = df.index.set_levels(pd.Categorical(df.index.levels[1]), level=1)
df.sum(level=[0, 1]).fillna(0, downcast='infer')

              volume1
year product         
2010 A             17
     B              7
     C              0
2011 A             10
     B              7
     C              5

答案 1 :(得分:0)

您可以groupby索引本身并在组内求和,如下所示:

import pandas as pd

# create example series
index = pd.MultiIndex.from_tuples(tuples=[(2010, 'A'), (2010, 'A'), (2010, 'B'), (2011, 'A'), (2011, 'B'), (2011, 'C')],
                                  names=['year', 'product'])
s = pd.Series(data=[10, 7, 7, 10, 7, 5], index=index)

# group by index and sum
result = s.groupby(index).sum()

# re-index the resulting pd.Series
result = result.reindex(pd.MultiIndex.from_tuples(result.index, names=s.index.names))

print(result)

输出

year  product
2010  A          17
      B           7
2011  A          10
      B           7
      C           5
dtype: int64