【问题标题】:Sum duplicated rows on a multi-index pandas dataframe对多索引 pandas 数据帧上的重复行求和
【发布时间】:2018-07-27 13:58:01
【问题描述】:

您好,我在与 Pandas 打交道时遇到了麻烦。我正在尝试对多索引 Dataframe 上的重复行求和。 我尝试了 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 的行。

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

有什么想法吗?谢谢

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    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)
    

    替代方案1,谢谢@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
    

    【讨论】:

    • 也许你可以添加 df.sum(level=[0,1]).unstack().stack(dropna=False)
    • 这个答案很完美。一个非常微妙的点是mux 也可以在sum 之前创建。这意味着同样的解决方案可以很容易地使用df.sum(level=[0, 1]).reindex(pd.MultiIndex.from_product(df.index.levels, names=df.index.names), fill_value=0)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-05-16
      • 2017-08-09
      • 1970-01-01
      • 2016-05-26
      • 2017-05-20
      • 2022-12-16
      • 2019-01-19
      • 2017-06-11
      • 2012-07-20
      相关资源
      最近更新 更多