如何检测用户取消订单后是否从同一店铺复购及实现方案咨询
解决取消订单后同一店铺复购用户的筛选问题
你的初始思路是完全可行的——先提取包含取消订单的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
相关产品推荐
相关产品推荐

