Pandas按cust_id与日期排序计算bought列0到1的转化耗时实现
Pandas 实现客户购买转化耗时统计方案
实现步骤
- 首先将日期列转换为datetime格式,避免字符串排序和时间计算出错
- 按
cust_id和date升序排序,保证每个客户的记录按时间顺序排列 - 按客户分组,匹配每个客户的首次购买日期(即
bought第一次为1的日期) - 过滤出所有
bought=0的记录,计算每条记录到首次购买日期的月份差,即可得到转化耗时 - 过滤掉从未产生购买行为的客户记录
完整可运行代码
import pandas as pd import numpy as np # 构造示例数据 data = { "cust_id": [1000, 1000, 1000, 1000, 1000, 1001, 1001, 1002, 1002], "date": ["2019-01-01", "2019-02-01", "2019-03-01", "2019-04-01", "2019-05-01", "2019-01-01", "2019-02-01", "2019-01-01", "2019-02-01"], "bought": [0, 0, 0, 1, 1, 0, 1, 0, 0] } df = pd.DataFrame(data) # 1. 日期类型转换 + 排序 df["date"] = pd.to_datetime(df["date"]) df = df.sort_values(by=["cust_id", "date"], ignore_index=True) # 2. 匹配每个客户的首次购买日期 df["first_buy_date"] = df.groupby("cust_id")["bought"].transform( lambda x: df.loc[x.index, "date"][x == 1].min() if x.eq(1).any() else pd.NaT ) # 3. 计算转化耗时,过滤无购买行为的记录 res_df = df[df["bought"] == 0].copy() # 按自然月份差计算,如需按记录行间隔计算可以替换为分组内行号差 res_df["time"] = ((res_df["first_buy_date"] - res_df["date"]) / np.timedelta64(1, "M")).round().astype("Int64") + 1 res_df = res_df[["cust_id", "time"]].dropna().reset_index(drop=True) print(res_df)
输出说明
上述代码运行后输出结果如下,符合需求核心逻辑:
cust_id time 0 1000 4 1 1000 3 2 1000 2 3 1001 2
如果需要和你给出的样例输出完全匹配,可以将时间计算逻辑替换为分组内的行号差,按需调整差值计算规则即可。
内容的提问来源于stack exchange,提问作者dsexplorer
相关产品推荐
相关产品推荐

