【问题标题】:Rolling subtraction over rows, multiple keys在行,多个键上滚动减法
【发布时间】:2021-05-15 20:30:25
【问题描述】:

我有两个如下所示的数据框:

df1:

| item| order | qty_ordered |
|-----|-------|-------------|
| 1   |   a1  |  5          |
| 1   |   a2  |  7          |
| 2   |   a3  |  10         |
| 2   |   a4  |  8          |

df2:

| item| on_hand|
|-----|--------|
| 1   |   26   |
| 2   |   12   |

我需要为每个项目获取qty_ordered,然后从on_hand 值中依次减去它们。

所以想要的输出是:

| item| order | qty_ordered | net |
|-----|-------|-------------|-----|
| 1   |   a1  |  5          |  21 |
| 1   |   a2  |  7          |  14 |
| 2   |   a3  |  10         |  2  |
| 2   |   a4  |  8          | -6  |

我用 .rolling() 和 .groupby(item) .diff() 尝试了几个不同的选项,但没有运气。

任何帮助将不胜感激!

【问题讨论】:

    标签: python pandas dataframe multi-index rolling-computation


    【解决方案1】:

    您可以在item 上尝试merge 然后groupbyqty_ordered 上的累积总和,然后从on_hand 中减去:

    out = df1.merge(df2,on='item') #how='left'
    out['net'] = out['on_hand'].sub(out.groupby("item")['qty_ordered'].cumsum())
    

    或者用 map ,同样的逻辑:

    df1['net'] = (df1['item'].map(df2.set_index("item")['on_hand'])
                   .sub(df1.groupby("item")['qty_ordered'].cumsum()))
    

    print(out)
    
       item order  qty_ordered  on_hand  net
    0     1    a1            5       26   21
    1     1    a2            7       26   14
    2     2    a3           10       12    2
    3     2    a4            8       12   -6
    

    【讨论】:

    • 非常感谢!效果很好
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多