You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pandas将连续观看的视频数据分组为会话?

视频观看会话分组解决方案

核心思路

通过时间差标记会话分割点,再利用累加生成会话ID,最终分组统计,解决连续多行的会话归属问题。

具体实现步骤

假设你的数据已加载到df这个DataFrame中,按以下步骤操作:

  1. 转换时间类型并排序
    先确保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)
    
  2. 标记新会话的分割点
    计算当前行与上一行的时间差,当时间差超过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()
    
  3. 生成会话ID
    对is_new_session列累加,相同会话的ID会保持一致:

    df['session_id'] = df.groupby('user_id')['is_new_session'].cumsum()
    
  4. 分组统计会话信息
    按用户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_idsession_start_timenumber_of_videos
27550259512022-09-17 12:31:353
27550259512022-09-17 12:45:042

为什么之前的方法不行?

  • iterrows()遍历效率低,且需要手动维护会话状态,容易出错,没法高效处理连续多行的递归判断。
  • shift()只能获取相邻行的时间差,无法将连续满足间隔条件的多行归为同一个会话,而通过cumsum()生成的会话ID可以自动把连续符合条件的记录归为一组。

内容的提问来源于stack exchange,提问作者salamander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:05:15