代码之家  ›  专栏  ›  技术社区  ›  CDVC23

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

  •  2
  • CDVC23  · 技术社区  · 6 年前

    你好,我在和熊猫打交道时遇到了麻烦。我正在尝试对多索引数据帧上的重复行求和。 我试过 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
    

    有什么想法吗?谢谢

    2 回复  |  直到 6 年前
        1
  •  3
  •   piRSquared    6 年前

    您可以将索引的第二级设置为 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
    
        2
  •  2
  •   jezrael    6 年前

    使用 sum 具有 unstack stack :

    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