Pandas对比前序日期新增列 识别用户近3个月复购记录
Pandas交易数据3个月复购标记实现方案
核心规则
新增repeat_purchase_P3M列的计算逻辑:
- 按用户
code分组独立计算 - 对每笔交易,检索该用户在当前交易日期往前3个月内的历史交易
- 若存在符合条件的记录,填入距离当前交易最近的一笔前序交易日期;无符合条件记录则填入
no
实现代码
import pandas as pd # 1. 读取数据并转换日期格式 df = pd.read_csv("transaction.csv") df["transaction_datetime"] = pd.to_datetime(df["transaction_datetime"]) # 2. 按用户分组,按时间排序后取每笔交易的最近一笔前序交易时间 df["prev_trade_date"] = df.groupby("code")["transaction_datetime"].shift(1) # 3. 逐行判断前序交易是否在3个月窗口内 def match_p3m_rule(row): # 无前序交易直接返回no if pd.isna(row["prev_trade_date"]): return "no" # 计算当前交易往前推3个月的时间节点,用自然月偏移避免天数计算误差 window_start = row["transaction_datetime"] - pd.DateOffset(months=3) if row["prev_trade_date"] >= window_start: return row["prev_trade_date"].strftime("%Y-%m-%d") return "no" df["repeat_purchase_P3M"] = df.apply(match_p3m_rule, axis=1) # 4. 格式对齐样例输出 df["transaction_datetime"] = df["transaction_datetime"].dt.strftime("%Y-%m-%d") df = df.drop(columns=["prev_trade_date"]) # 导出结果 df.to_csv("transaction_with_repeat_flag.csv", index=False)
结果验证
运行代码后得到的输出和预期完全一致:
code,transaction_datetime,repeat_purchase_P3M 1,2021-12-01,no 1,2022-01-24,2021-12-01 1,2022-05-29,no 2,2021-11-20,no 2,2022-04-12,no 2,2022-06-02,2022-04-12 3,2021-04-23,no 3,2022-04-22,no
注:代码中使用
pd.DateOffset(months=3)计算3个月窗口,是按自然月规则偏移,比固定90天的计算方式更符合通用业务的"近3个月"定义,可避免大小月、闰年带来的计算偏差。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

