如何使用Pandas将连续观看的视频数据分组为会话?
视频观看会话分组解决方案
核心思路
通过时间差标记会话分割点,再利用累加生成会话ID,最终分组统计,解决连续多行的会话归属问题。
具体实现步骤
假设你的数据已加载到df这个DataFrame中,按以下步骤操作:
转换时间类型并排序
先确保view_time是datetime格式,同时按用户ID和观看时间排序,保证观看顺序正确:import pandas as pd # 转换时间列类型 df['view_time'] = pd.to_datetime(df['view_time']) # 按用户ID和观看时间升序排序 df = df.sort_values(by=['user_id', 'view_time']).reset_index(drop=True)标记新会话的分割点
计算当前行与上一行的时间差,当时间差超过5分钟(或为用户的第一条记录)时,标记为新会话的开始:# 计算相邻记录的时间差(单位:分钟) df['time_diff'] = df.groupby('user_id')['view_time'].diff().dt.total_seconds() / 60 # 标记新会话:时间差>5分钟 或者 是用户的第一条记录 df['is_new_session'] = (df['time_diff'] > 5) | df['time_diff'].isna()生成会话ID
对is_new_session列累加,相同会话的ID会保持一致:df['session_id'] = df.groupby('user_id')['is_new_session'].cumsum()分组统计会话信息
按用户ID和会话ID分组,聚合得到会话开始时间和视频数量:result = df.groupby(['user_id', 'session_id']).agg( session_start_time=('view_time', 'min'), number_of_videos=('pid', 'count') ).reset_index(drop=True)
示例运行结果
用你提供的测试数据运行后,会得到:
| user_id | session_start_time | number_of_videos |
|---|---|---|
| 2755025951 | 2022-09-17 12:31:35 | 3 |
| 2755025951 | 2022-09-17 12:45:04 | 2 |
为什么之前的方法不行?
iterrows()遍历效率低,且需要手动维护会话状态,容易出错,没法高效处理连续多行的递归判断。shift()只能获取相邻行的时间差,无法将连续满足间隔条件的多行归为同一个会话,而通过cumsum()生成的会话ID可以自动把连续符合条件的记录归为一组。
内容的提问来源于stack exchange,提问作者salamander
相关产品推荐
相关产品推荐

