代码之家  ›  专栏  ›  技术社区  ›  Ryan Barnett

Pandas:向MultiIndex添加新列

  •  1
  • Ryan Barnett  · 技术社区  · 1 年前

    我很难找到一种方法来添加一个额外的列,该列包含bin列中项目的总和。

    这是因为我想有一种方法来显示稍后剩余物品少于这么多的箱子。但仍需要查看单个数量。

    我认为通过应用lambda函数来添加额外的列是正确的?

    感谢任何帮助或建议,谢谢。

    data = [['Jacket 1', 10, 'A'], ['Jacket 2', 2, 'A'], ['Jacket 3', 1, 'B'], ['Jacket 4', 3, 'B']]
    
    df = pd.DataFrame(data, columns=['item', 'qty', 'bin'])
    
    df
    
    item    qty bin
    0   Jacket 1    10  A
    1   Jacket 2    2   A
    2   Jacket 3    1   B
    3   Jacket 4    3   B
    
    grouped = df.groupby(['bin', 'item']).agg({'qty' : 'sum'})
    
    
    grouped
    
                   qty
    bin item    
    A   Jacket 1    10
        Jacket 2    2
    B   Jacket 3    1
        Jacket 4    3
    

    下面是我想要得到的。如果可能的话?

                   qty     Total 
    bin item    
    A   Jacket 1    10      12
        Jacket 2    2
    B   Jacket 3    1       4
        Jacket 4    3
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   Scott Boston    1 年前

    如果你真的想发挥创造力并使用海象操作符,你可以在一行代码中做到这一点:

    (dfs:=df.groupby(['bin', 'item']).agg({'qty' : 'sum'})).assign(total = dfs.groupby('bin')['qty'].transform('sum').drop_duplicates())
    

    输出:

                  qty  total
    bin item                
    A   Jacket 1   10   12.0
        Jacket 2    2    NaN
    B   Jacket 3    1    4.0
        Jacket 4    3    NaN
    
        2
  •  1
  •   rhug123    1 年前

    尝试按第一级分组,然后使用 .where() 以及复制,只保留第一个条目。

    grouped.assign(
        Total = grouped.groupby(level=0)['qty'].transform('sum')
        .where(~grouped.droplevel(1).index.duplicated())
        )
    

    输出:

                  qty  Total
    bin item                
    A   Jacket 1   10   12.0
        Jacket 2    2    NaN
    B   Jacket 3    1    4.0
        Jacket 4    3    NaN