如何使用pandas为日志数据按规则分配session ID(会话ID)
Pandas 实现会话ID分配方案
实现思路
- 先将时间列转换为pandas可计算的datetime格式,保留原始数据索引避免排序打乱原顺序
- 按用户ID和访问时间分组排序,计算同一用户相邻两次访问的时间差
- 若为用户首次访问,或相邻访问时间差超过6小时,标记为新会话
- 对新会话标记做全局累加,得到不同用户互不重复的全局唯一session ID
完整实现代码
import pandas as pd # 构造示例数据,实际使用时替换为你的数据读取逻辑即可 data = { 'user': [0, 0, 1, 0, 2, 1], 'time': [ '2020-05-23 00:01:19', '2020-05-23 00:13:32', '2020-05-23 00:13:45', '2020-05-23 12:59:45', '2020-05-23 13:13:13', '2020-05-23 15:13:45' ] } df = pd.DataFrame(data) # 保留原始索引,后续恢复顺序用 df = df.reset_index(names='original_idx') # 转换时间格式 df['time'] = pd.to_datetime(df['time']) # 按用户、访问时间排序,保证同用户访问时间按升序排列 df = df.sort_values(['user', 'time']) # 计算同用户相邻两次访问的时间差 df['time_diff'] = df.groupby('user')['time'].diff() # 标记新会话:首次访问 或 相邻访问间隔超过6小时 df['new_session'] = df['time_diff'].isna() | (df['time_diff'] > pd.Timedelta(hours=6)) # 全局累加新会话标记,得到从0开始的唯一session_id df['session_id'] = df['new_session'].cumsum() - 1 # 恢复原始数据顺序,删除中间计算列 df = df.sort_values('original_idx').drop(columns=['original_idx', 'time_diff', 'new_session']).reset_index(drop=True) print(df)
输出结果
运行上述代码得到的结果和预期完全一致:
user time session_id 0 0 2020-05-23 00:01:19 0 1 0 2020-05-23 00:13:32 0 2 1 2020-05-23 00:13:45 1 3 0 2020-05-23 12:59:45 2 4 2 2020-05-23 13:13:13 3 5 1 2020-05-23 15:13:45 4
内容的提问来源于stack exchange,提问作者romanteruma
相关产品推荐
相关产品推荐

