在行上滚动减法,多个键

Rolling subtraction over rows, multiple keys

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

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() 尝试了几个不同的选项,但没有成功。

如有任何帮助,我们将不胜感激!

您可以尝试 merge 然后 groupby item 和累加 qty_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