如何合并两个DataFrame并统计唯一行的订单数量?
问题分析与解决
原始数据
Table 1(订单表)
Order_id Prod_id Price A AA 5 B BB 10 C CC 15 D AA 5 E CC 20
Table 2(产品价格组合表)
Prod_id Price AA 5 BB 10 CC 15 CC 20
目标结果
需要得到每个产品-价格组合对应的订单数量(同一订单同一组合仅计一次):
Table 3: Prod_id Price Order_Count AA 5 2 BB 10 1 CC 15 1 CC 20 1
你的代码问题
你当前的代码存在几个关键问题:
- 冗余且错误的Merge操作:没必要将同一个表的不同子集做Merge,这会导致数据重复膨胀,后续去重也容易引入误差。
- 列名可能不匹配:你原始数据里的列名是
Prod_id,但代码中使用的是product_id,如果实际表的列名不一致,会导致Merge匹配失败,统计结果完全错误。 - 统计逻辑与列名错误:最后一行
order_counts['No_of_orders'].sum()里的列名写错了,你重命名的是order_count,不是No_of_orders,这行代码应该会报错;另外用groupby.size()的逻辑冗余,不如直接统计唯一订单数精准。
正确解决方案
方法一:统计后匹配产品价格表
核心逻辑是先按Prod_id和Price分组,统计每组的唯一订单数,再和Table 2做左连接确保保留所有需要的产品价格组合:
import pandas as pd # 假设Table1的变量名为order_table,Table2为prod_price_table # 统计每个产品-价格组合的唯一订单数 order_count_df = order_table.groupby(['Prod_id', 'Price'])['Order_id'].nunique().reset_index(name='Order_Count') # 左连接Table2,确保保留所有目标组合 result = pd.merge(prod_price_table, order_count_df, on=['Prod_id', 'Price'], how='left') print(result)
方法二:直接统计(若Table2是Table1的去重组合)
如果Table2只是Table1中Prod_id+Price的去重结果,那可以直接对Table1分组统计,无需额外连接:
result = order_table.groupby(['Prod_id', 'Price'])['Order_id'].nunique().reset_index(name='Order_Count')
这段代码会直接输出你想要的Table3结果,nunique()会自动统计每个分组下的唯一订单数量,完全符合你的需求:相同Prod_id+Price算一组,不同Price的同一产品分开统计。
内容的提问来源于stack exchange,提问作者Simran Aswani
相关产品推荐
相关产品推荐

