如何使用Python实现基于5分钟间隔的用户行为数据会话划分
问题说明
你原有代码的问题是用相邻两条记录的间隔判断是否新开会话,没有跟踪会话的起始时间。比如如果用户三条记录的时间分别是第0分钟、第3分钟、第7分钟,原有逻辑会把第7分钟的记录归到第一个会话(因为和第3分钟间隔只有4分钟),但按照需求,第一个会话有效期到第5分钟,第7分钟应该属于新会话。
正确实现代码
import pandas as pd # 1. 读入数据并按用户、时间排序(这部分你原有逻辑是对的) df = pd.read_csv(r".\Data\Test.csv", names=['userID','timestamp'], parse_dates=[1]) df.sort_values(by=['userID','timestamp'], inplace=True) # 2. 定义单用户会话标记函数 def tag_session(user_group): # 初始化第一个会话的起始时间为用户第一条记录的时间 current_session_start = user_group['timestamp'].iloc[0] new_session_flag = [1] # 遍历用户后续所有记录 for idx in range(1, len(user_group)): current_time = user_group['timestamp'].iloc[idx] # 判断当前时间是否超出当前会话的5分钟有效期 if current_time - current_session_start > pd.Timedelta(5, 'm'): # 超出则标记为新会话,更新会话起始时间 new_session_flag.append(1) current_session_start = current_time else: # 未超出则归属当前会话 new_session_flag.append(0) user_group['NewSession'] = new_session_flag # 如果需要连续的SessionID,可放开下方注释 # user_group['SessionID'] = new_session_flag.cumsum() return user_group # 3. 按用户分组应用标记函数 df = df.groupby('userID', group_keys=False).apply(tag_session) # 输出结果验证 print(df)
效果说明
运行上述代码得到的NewSession列和你给出的预期输出完全一致,逻辑完全符合「同一会话首次动作后5分钟内所有操作归属该会话」的规则。
内容的提问来源于stack exchange,提问作者Sarvi
相关产品推荐
相关产品推荐

