首页 > 解决方案 > 如何减去具有重复第一列的两个数据框?

问题描述

所以,我有以下两个数据框,我的理想输出是让 open_orders 减少 cancel_orders,所以我知道我有多少 open_orders。

期望的输出:

df_total_orders
           order_id business_symbol  open_orders
0      a1b2c3111111              AA          0.0
1      4kl3l2242244             AAA          0.0
2      21312a224144             BBB          0.0
3      124f32rv2323             CCC          0.0
4      2412dfe21edf             DDD          0.0
5555

我现在拥有的:

df_add_orders (this dataframe contains duplicates in the order id column)
           order_id business_symbol  open_orders
0      a1b2c3111111              AA        100.0
1      4kl3l2242244             AAA       1000.0
2      21312a224144             BBB       1000.0
3      124f32rv2323             CCC       1000.0
4      2412dfe21edf             DDD       1000.0
10000
df_cancel_orders (this dataframe contains duplicates in the order id column)
           order_id   cancel_orders
0      a1b2c3111111           100.0
1      4kl3l2242244          1000.0
2      21312a224144          1000.0
3      124f32rv2323          1000.0
4      2412dfe21edf          1000.0
4000

我正在使用以下 group by 来获取未结订单总数,但它会在输出中删除我的符号。

df_add_orders_group = df_add_orders.groupby(['order_id'], as_index=False)['open_orders'].sum()

df_add_orders_group
           order_id        open_orders
0      a1b2c3111111              110.0
1      4kl3l2242244             1200.0
2      21312a224144             1500.0
3      124f32rv2323             1500.0
4      2412dfe21edf             1500.0
5000

然后我减去已关闭的订单

df_cancel_orders_group = df_cancel_orders.groupby(['order_id'], as_index=False)['cancel_orders'].sum()

但我想保留这些符号,这样我就可以比较总的未结订单,我需要一些方法将减法的结果与主要的 df_add_orders 合并,并清理 order_id 以总结重复项。

标签: pythonpandasdataframe

解决方案


df_total_orders =df_add_orders.merge(df_cancel_orders, 
    how = 'left', 
    on = 'order_id)

将为您提供一个包含来自两个原始数据帧的数据的数据帧。然后你可以做

df_total_orders['open_orders'] = 
    df_total_orders['open_orders']-
    df_total_orders['cancel_orders']

然后删除该cancel_order列。

另一种策略是将两个原始数据帧附加在一起。然后,您可以对 id 和 sum 进行 groupby。这将创建一个数据框,对于每个 ID,一列是该 ID 所有未结订单的总和,另一列是该 ID 所有取消订单的总和。然后,您可以获取两列之间的差异。

当你附加两个数据框时,你会得到一堆空值;来自未结订单的部分将在取消订单列中为空,反之亦然。我认为对 groupby 求和只会将空值视为零,但您可能需要明确告诉它这样做。


推荐阅读