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

如何将第一个唯一的多重索引设置为0,并计算其他索引的值

  •  1
  • windyvation  · 技术社区  · 2 年前

    基于以下样本数据,构建了以下数据框架:

    day = [1, 2, 3, 2, 3, 1, 2]
    item_id = [1, 1, 1, 2, 2, 3, 3]
    item_name = ['A', 'A', 'A', 'B', 'B', 'C', 'C']
    increase = [4, 0, 4, 3, 3, 3, 3]
    decrease = [2, 2, 2, 1, 1, 1, 1]
    my_df = pd.DataFrame(list(zip(day, item_id, item_name, increase, decrease)),
                         columns=['day', 'item_id', 'item_name', 'increase', 'decrease'])
    my_df = my_df.set_index(['item_id', 'item_name'])
    

    enter image description here

    我想创建两个新专栏:

    1. 起始数量[0]将索引(或多索引)的每个初始值设置为0
    2. 结束时的数量增加了 increase 然后减去 decrease
    3. 起始数量[1,2,3,…]等于前一天的结束数量。

    我想创建的输出如下:

    enter image description here

    如果您能帮助完成以上三个步骤中的任何一个或全部,我将不胜感激!

    1 回复  |  直到 2 年前
        1
  •  1
  •   Andrej Kesely    2 年前

    尝试:

    my_df = my_df.set_index(["item_id", "item_name"])
    g = my_df.groupby(level=0)
    
    my_df["tmp"] = my_df["increase"] - my_df["decrease"]
    
    my_df["starting_quantity"] = g["tmp"].shift().fillna(0)
    my_df["starting_quantity"] = g["starting_quantity"].cumsum().astype(int)
    
    my_df["ending_quantity"] = g["tmp"].cumsum()
    my_df = my_df.drop(columns="tmp")
    
    print(my_df)
    

    印刷品:

                       day  increase  decrease  starting_quantity  ending_quantity
    item_id item_name                                                             
    1       A            1         4         2                  0                2
            A            2         0         2                  2                0
            A            3         4         2                  0                2
    2       B            2         3         1                  0                2
            B            3         3         1                  2                4
    3       C            1         3         1                  0                2
            C            2         3         1                  2                4