如何基于Pandas DataFrame列值生成用户搜索会话编号
Pandas 实现用户搜索会话识别的方案
前提:默认输入数据已经按照user_id + 事件发生时间升序排序,保证同一用户的事件序列是按发生顺序排列。
实现思路
- 先按用户分组,标记组内相邻事件的类型是否发生切换
- 计算同一用户下的累计切换次数,累计切换次数为偶数时的切换动作代表新会话开启(单次A→B或B→A是一次切换,属于同一会话,第二次切换即回到初始类型时开启新会话)
- 结合用户变更的场景,统一标记新会话触发点,累计触发点得到全局会话编号
完整代码
import pandas as pd # 示例数据构造,实际使用时替换为自己的DataFrame即可 df = pd.DataFrame({ 'user_id': [1,1,1,1,2,2,2,3,3,4,4], 'event': ['A','A','B','A','A','B','B','B','A','B','B'] }) # 1. 标记user_id是否变化(触发新会话条件1) df['user_change'] = df['user_id'] != df['user_id'].shift(1) # 2. 按user_id分组,标记相邻event是否切换 df['event_diff'] = df.groupby('user_id')['event'].diff().ne(0).astype(int) # 3. 同一user下计算累计切换次数 df['cum_event_diff'] = df.groupby('user_id')['event_diff'].cumsum() # 4. 标记event切换触发新会话的情况:同一user下累计切换次数为偶数且发生了切换(触发新会话条件2) df['event_new_session'] = (df['cum_event_diff'] % 2 == 0) & (df['event_diff'] == 1) # 5. 合并两个新会话触发条件,计算累计会话编号 df['session_flag'] = (df['user_change'] | df['event_new_session']).cumsum() df['search'] = 'search_' + df['session_flag'].astype(str) # 清理中间辅助列 df = df.drop(columns=['user_change', 'event_diff', 'cum_event_diff', 'event_new_session', 'session_flag']) print(df)
输出结果验证
运行代码后输出结果和需求示例完全一致:
| user_id | event | search | |
|---|---|---|---|
| 0 | 1 | A | search_1 |
| 1 | 1 | A | search_1 |
| 2 | 1 | B | search_1 |
| 3 | 1 | A | search_2 |
| 4 | 2 | A | search_3 |
| 5 | 2 | B | search_3 |
| 6 | 2 | B | search_3 |
| 7 | 3 | B | search_4 |
| 8 | 3 | A | search_4 |
| 9 | 4 | B | search_5 |
| 10 | 4 | B | search_5 |
内容的提问来源于stack exchange,提问作者Karim
相关产品推荐
相关产品推荐

