Pandas以多列为一组,并保留所有其他列。

我有一个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)

给TA打赏
共{{data.count}}人
人已打赏
解决方案

pgbench无效的客户数

2022-4-21 14:09:19

解决方案

在C++中,如何用不同长度的字符串替换一个命令行参数。

2022-4-21 15:08:45

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索