You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个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

你的代码问题

你当前的代码存在几个关键问题:

  1. 冗余且错误的Merge操作:没必要将同一个表的不同子集做Merge,这会导致数据重复膨胀,后续去重也容易引入误差。
  2. 列名可能不匹配:你原始数据里的列名是Prod_id,但代码中使用的是product_id,如果实际表的列名不一致,会导致Merge匹配失败,统计结果完全错误。
  3. 统计逻辑与列名错误:最后一行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:43:16