你好,我遇到了与熊猫打交道的麻烦。我试图在多索引Dataframe上对重复的行求和。
我尝试使用df.stack().reset_index().groupby(['year', 'product']).sum()
,还使用 volume1 volume2
year product
2010 A 10 12
A 7 3
B 7 7
2011 A 10 10
B 7 6
C 5 5
和其他一些人,但我无法让它发挥作用。
我还想为每一年添加每一个独特的产品,如果没有列出,我们会给它们一个0值。
示例:具有多索引和3种不同产品(A,B,C)的数据框:
volume1 volume2
year product
2010 A 17 15
B 7 7
C 0 0
2011 A 10 10
B 7 6
C 5 5
预期产出:如果某一年有重复的产品,那么我们将它们相加。 如果其中一个产品未列出一年,我们将创建一个完整的新行。
{{1}}
有什么想法吗?感谢
答案 0 :(得分:3)
您可以将索引的第二级设为CategoricalIndex
,当您使用groupby
时,它将包含所有类别。
df.index.set_levels(pd.CategoricalIndex(df.index.levels[1]), 1, inplace=True)
df.groupby(level=[0, 1]).sum().fillna(0, downcast='infer')
volume1 volume2
year product
2010 A 17 15
B 7 7
C 0 0
2011 A 10 10
B 7 6
C 5 5
答案 1 :(得分:2)
df = df.sum(level=[0,1]).unstack(fill_value=0).stack()
#same as
#df = df.groupby(level=[0,1]).sum().unstack(fill_value=0).stack()
替代reindex
:
df = df.sum(level=[0,1])
#same as
#df = df.groupby(level=[0,1]).sum()
mux = pd.MultiIndex.from_product(df.index.levels, names = df.index.names)
df = df.reindex(mux, fill_value=0)
Alternative1,谢谢@Wen:
df = df.sum(level=[0,1]).unstack().stack(dropna=False)
print (df)
volume1 volume2
year product
2010 A 17 15
B 7 7
C 0 0
2011 A 10 10
B 7 6
C 5 5