在行上滚动减法,多个键
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
我有两个如下所示的数据框:
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