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

如何检测用户取消订单后是否从同一店铺复购及实现方案咨询

解决取消订单后同一店铺复购用户的筛选问题

你的初始思路是完全可行的——先提取包含取消订单的userid+shopid组合,再用这个组合去过滤数据,这个方向抓准了核心匹配条件。不过要注意关键的一点:复购必须是发生在取消订单之后,所以我们需要加上时间维度的判断来精准筛选。

下面是具体的分步解决方案(基于Pandas):

第一步:预处理时间列(确保可比较)

首先要确保时间列是datetime类型,否则时间比较会出错:

import pandas as pd

# 转换时间列为datetime格式
df_final1['created_time'] = pd.to_datetime(df_final1['created_time'])
df_final1['cancel_time'] = pd.to_datetime(df_final1['cancel_time'])

第二步:提取所有取消订单的核心信息

先把所有取消订单的userid、shopid和对应的取消时间提取出来:

# 获取所有取消订单的记录,保留关键字段
cancelled_records = df_final1[
    df_final1['status'].str.contains('cancelled', case=False)
][['userid', 'shopid', 'cancel_time']]

第三步:匹配同一用户店铺下的后续有效订单

将取消订单数据与原始数据合并,筛选出取消时间之后创建的、非取消状态的订单(也就是真正的复购订单):

# 合并取消订单和原始数据,匹配同一userid+shopid的所有订单
merged_data = pd.merge(
    cancelled_records,
    df_final1[['userid', 'shopid', 'status', 'created_time']],
    on=['userid', 'shopid'],
    how='left'
)

# 过滤条件:订单创建时间晚于取消时间,且订单状态为非取消(比如Paid)
valid_repurchases = merged_data[
    (merged_data['created_time'] > merged_data['cancel_time']) &
    (~merged_data['status'].str.contains('cancelled', case=False))
]

第四步:得到唯一的复购用户/用户-店铺组合

如果需要去重后的结果(避免同一用户多次复购被重复统计):

# 获取唯一的userid+shopid组合(如果只需要用户ID,就取['userid'].drop_duplicates())
unique_repurchase_users = valid_repurchases[['userid', 'shopid']].drop_duplicates()

# 查看结果
print(unique_repurchase_users)

针对你已有的repurchase_true数据集的简化处理

如果你已经得到了repurchase_true(包含有取消订单且同一userid+shopid的所有记录),可以直接在这个数据集上处理:

# 拆分取消订单和有效订单
cancelled_in_rt = repurchase_true[
    repurchase_true['status'].str.contains('cancelled', case=False)
][['userid', 'shopid', 'cancel_time']]

valid_orders_in_rt = repurchase_true[
    ~repurchase_true['status'].str.contains('cancelled', case=False)
][['userid', 'shopid', 'created_time']]

# 合并并筛选时间符合条件的记录
final_result = pd.merge(
    cancelled_in_rt,
    valid_orders_in_rt,
    on=['userid', 'shopid'],
    how='inner'
)
final_result = final_result[final_result['created_time'] > final_result['cancel_time']]

# 去重得到最终用户
final_repurchase_users = final_result[['userid', 'shopid']].drop_duplicates()

关键注意事项

  • 一定要验证时间列的格式,否则时间比较会失效;
  • 如果同一个用户在同一店铺有多次取消和复购,drop_duplicates()可以帮你得到唯一的统计对象;
  • 你的初始思路只缺了时间先后的判断,补上之后就能精准筛选出取消后复购的用户了。

内容的提问来源于stack exchange,提问作者CW_2434

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:12:34