统计用户首次折扣消费后后续交易次数的实现方法咨询
实现方案
前置说明
你原有代码存在两个问题:
- 运算符优先级错误:
&优先级高于==,原有逻辑会优先计算1 & df_coup['LOGDATE'],导致输出结果不符合预期,需要给判断条件分别加括号 - 逻辑偏差:原代码仅筛选了「使用折扣且日期晚于LOGDATE1」的订单,没有关联用户维度的首次折扣时间统计,也没有覆盖用户后续的非折扣交易,不符合需求统计口径
完整实现(无需循环,Pandas向量化操作效率更高)
假设你的数据集包含user_id(用户唯一标识)、LOGDATE(每笔订单交易日期)、DISC_BI(订单是否使用折扣,1为是)三个核心字段,按以下步骤执行:
- 预处理日期字段,保证日期比较逻辑正确
import pandas as pd # 转换为日期格式,可根据实际数据格式调整format参数 df_coup['LOGDATE'] = pd.to_datetime(df_coup['LOGDATE'], format='%Y-%m-%d')
- 匹配每个用户的首次折扣消费日期
# 提取所有折扣订单,按用户分组取最小日期即首次折扣消费时间 first_disc_date = df_coup[df_coup['DISC_BI'] == 1].groupby('user_id')['LOGDATE'].min().rename('first_disc_date') # 把首次折扣时间回拼到原数据集 df_coup = df_coup.join(first_disc_date, on='user_id') # 筛选出所有有过首次折扣消费的用户的全部订单 target_df = df_coup[df_coup['first_disc_date'].notna()]
- 统计每个用户首次折扣后的交易次数
# 标记订单是否为首次折扣之后产生的 target_df['is_post'] = target_df['LOGDATE'] > target_df['first_disc_date'] # 按用户维度统计后续交易次数 user_post_cnt = target_df.groupby('user_id')['is_post'].sum().rename('post_cnt').reset_index()
- 计算不复购用户占比
no_repurchase_rate = (user_post_cnt['post_cnt'] == 0).mean() print(f"首次到店享折扣的用户中有{no_repurchase_rate:.2%}不会复购")
自定义调整参考
- 如果需要限定复购统计周期(比如统计首次折扣后30天内的复购),可以把
target_df['is_post']的判断逻辑调整为:target_df['is_post'] = (target_df['LOGDATE'] > target_df['first_disc_date']) & (target_df['LOGDATE'] <= target_df['first_disc_date'] + pd.Timedelta(days=30)) - 如果需要排除退单、取消订单等无效交易,可以在第一步预处理时先过滤掉无效订单数据
内容的提问来源于stack exchange,提问作者Chris Moriarity
相关产品推荐
相关产品推荐

