对多索引pandas datafram上的重复行求和

2024-05-19 12:51:28 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我和熊猫打交道有困难。我正在尝试对多索引数据帧上的重复行求和。 我试过使用df.groupby(level=[0,1]).sum(),也尝试了df.stack().reset_index().groupby(['year', 'product']).sum()和其他一些工具,但是我不能让它工作。 我还想为每一年添加每一个独特的产品,如果它们没有被列出的话,给它们一个0值。在

示例:具有多索引和3种不同产品(A、B、C)的数据帧:

                  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。在

^{pr2}$

有什么想法吗?谢谢


Tags: 工具数据示例dfindex产品stackproduct
2条回答

sum^{}^{}一起使用:

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()

替换为^{}

^{pr2}$

备选方案1,谢谢@文:

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

您可以将索引的第二级设为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

相关问题 更多 >