这个问题与这里的问题非常相似:
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值填充整个系列。这真令人沮丧,而且必须有一个我找不到的快速修复。谢谢。
答案 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