Python高效实现用户访问时间戳转session_id 适配千万级数据集
高效实现方案
直接使用Pandas向量化运算替代Python层循环,2000万条数据普通消费级机器即可在10秒内跑完,核心逻辑基于分组累加标记实现。
前置要求
确保原始数据已经按user + timestamp升序排序,若未排序先执行排序操作:
import pandas as pd df = df.sort_values(by=["user", "timestamp"]).reset_index(drop=True)
核心实现代码
# 1. 生成新会话标记:用户第一条访问、或相邻间隔≥30分钟标记为新会话 # 若用户首条记录的minutes为空值用以下写法 df["new_session"] = df.groupby("user")["minutes"].transform( lambda x: (x.isna()) | (x >= 30) ) # 若用户首条记录的minutes为0用以下写法 # df["new_session"] = df.groupby("user")["minutes"].transform( # lambda x: x.shift(fill_value=30) >= 30 # ) # 2. 累加新会话标记生成用户内会话序号,拼接用户ID得到全局唯一session_id df["session_inner_id"] = df.groupby("user")["new_session"].cumsum() df["session_id"] = df["user"].astype(str) + "_" + df["session_inner_id"].astype(str) # 3. 可选:删除辅助字段 df = df.drop(columns=["new_session", "session_inner_id"])
输出示例
| user | timestamp | minutes | session_id |
|---|---|---|---|
| u1 | 2024-01-01 08:00:00 | NaN | u1_1 |
| u1 | 2024-01-01 08:10:00 | 10 | u1_1 |
| u1 | 2024-01-01 08:50:00 | 40 | u1_2 |
| u2 | 2024-01-01 09:00:00 | NaN | u2_1 |
超大数据量补充方案
如果数据量超过单机内存承载,可替换为Dask框架执行上述逻辑,API和Pandas完全兼容,支持分块处理无需修改核心代码。
内容的提问来源于stack exchange,提问作者Rahul Monish
相关产品推荐
相关产品推荐

