如何基于网站事件数据计算session_id?15分钟间隔生成新会话ID
生成用户会话ID的Pandas实现
会话划分的核心逻辑是:同一用户的相邻事件,若时间戳间隔超过设定阈值,则判定为新会话。结合你提供的示例,我们可以用groupby和shift方法实现无循环的高效计算,步骤如下:
步骤说明
- 先对数据按
user_id和time_stamp排序,确保同一用户的事件按时间顺序排列 - 计算同一用户组内,当前事件与上一事件的时间差
- 标记出需要开启新会话的事件(首次事件或时间差超过阈值)
- 对每个用户的会话标记做累加,生成连续的
session_id
完整代码实现
import pandas as pd # 原始数据 df = pd.DataFrame([['123', 1], ['123', 1], ['123', 19], ['234', 7], ['234', 28], ['234', 29]], columns=['user_id', 'time_stamp']) # 1. 按用户和时间戳排序,保证事件顺序正确 df = df.sort_values(['user_id', 'time_stamp']).reset_index(drop=True) # 2. 定义会话超时阈值(示例中阈值为18,可根据实际业务调整) SESSION_TIMEOUT = 18 # 3. 计算同一用户相邻事件的时间差 df['time_diff'] = df.groupby('user_id')['time_stamp'].shift(1).apply(lambda x: df['time_stamp'] - x) # 4. 生成会话切换标记:首次事件或时间差超过阈值则标记为1 df['session_switch'] = ((df['time_diff'] > SESSION_TIMEOUT) | df['time_diff'].isna()).astype(int) # 5. 按用户累加切换标记,得到从0开始的session_id df['session_id'] = df.groupby('user_id')['session_switch'].cumsum() - 1 # 可选:删除中间辅助列 df = df.drop(['time_diff', 'session_switch'], axis=1) print(df)
输出结果
运行代码后会得到与你目标一致的结果:
user_id time_stamp session_id 0 123 1 0 1 123 1 0 2 123 19 1 3 234 7 0 4 234 28 1 5 234 29 1
关键代码解释
groupby('user_id')['time_stamp'].shift(1):在每个用户的事件组内,将上一行的时间戳移到当前行,用于计算时间差session_switch列:标记哪些事件是新会话的起点,isna()处理用户的第一个事件(没有上一行数据)cumsum():对每个用户的切换标记累加,减1是为了让session_id从0开始计数,和示例格式匹配
内容的提问来源于stack exchange,提问作者Maxim Moloshenko
相关产品推荐
相关产品推荐

