我有一个DF是 concat
的两个相同结构的df,第一个是 Orders
二是 Cancels
.其中有超过20,000行。Orders
和少数人 Cancels
具备相应 OrderNo
& ItemCode
. 我把取消的数量设为负数,这样,当把df按这两个 OrderNo
& ItemCode
我可以用 agg
从而给我实际的发货数量,以补偿取消的订单。
下面是我的数据框架。
OrderNo OrderDate LineNo ClientNo ItemCode QtyOrdered QtyShipped
0 528758 1/3/2017 1 1358538 111931 70 70
1 528791 1/3/2017 10 1254798 110441 300 300
2 528791 1/3/2017 1 1254798 1029071 10 10
3 528791 1/3/2017 2 1254798 1033341 10 10
4 528791 1/3/2017 8 1254798 1040726 15 15
... ... ... ... ... ... ... ...
28344 537667 2/6/2017 12 43823870 10137992 0 -2
28345 537771 2/7/2017 5 1276705 1041106 0 -4
28346 539524 2/13/2017 6 1254798 1038323 0 -10
28347 542362 2/23/2017 11 1254612 1041108 0 -2
28348 542835 2/23/2017 13 1255235 10137993 0 -5
28349 rows × 7 columns
运行后,
ActualOrders = PreActualOrders.groupby(['OrderNo','ItemCode']).agg({'QtyOrdered': 'sum', 'QtyShipped': 'sum'}).reset_index()
我得到了我想要的结果,但我失去了DF中的所有其他列。
结果示例如下。
OrderNo ItemCode QtyOrdered QtyShipped
28255 543734 1038324 1 1
28256 543734 10137992 1 1
28257 543734 10137993 1 1
28258 543735 1041106 1 1
28259 543735 1041108 1 1
28260 543735 10135359 1 1
我需要添加什么才能保持原DF中的所有列?
其他列中的所有值都匹配,因为它们是对应的取消或顺序。
谢谢你。
MTH
解决方案:
如果我理解的没错,你也许可以尝试另一种没有groupby.类似这样的方法。
orders = [["123", "1", 10], ["1234", "2", 100], ["12345", "3", 15]]
cancels = [["123", "1", 10]]
df_orders = pd.DataFrame(orders, columns=["OrderNo", "ItemCode", "Amount"])
df_cancels = pd.DataFrame(cancels, columns=["OrderNo", "ItemCode", "Amount"])
merged = df_orders.merge(df_cancels, how="left", on=["OrderNo", "ItemCode"], suffixes=["_orders", "_cancels"])
merged["Amount_cancels"] = merged["Amount_cancels"].fillna(0)
print("Before substract cancels")
print(merged)
merged["Amount_orders"] = merged["Amount_orders"] - merged["Amount_cancels"]
print("After substract cancels")
print(merged)