对多索引pandas数据帧上的重复行求和

时间:2018-02-16 15:58:48

标签: python pandas dataframe multi-index

你好,我遇到了与熊猫打交道的麻烦。我试图在多索引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}}

有什么想法吗?感谢

2 个答案:

答案 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)

sumunstackstack一起使用:

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
相关问题