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

基于Pandas按user_id和session_id分组,筛选每组前3条记录

解决DataFrame分组筛选前N条记录的问题

我来帮你搞定这个需求!你要实现的是:对每个(user_id, session_id)分组,先按time排序,然后只保留每组的前3条记录(组内记录少于3条时就全部保留)。

核心思路

不需要先单独统计每组数量再筛选,我们可以直接在分组后给每条记录分配组内排序后的序号,然后只保留序号≤3的记录即可,一步到位更高效。

具体步骤与代码

  1. 确保时间列格式正确
    首先要把time列转换成datetime类型,这样排序才会按正确的时间顺序来:

    import pandas as pd
    
    # 转换time列为datetime类型
    df['time'] = pd.to_datetime(df['time'])
    
  2. 分组排序并生成组内序号
    我们先对整个DataFrame按user_id、session_id和time排序,然后给每个分组内的记录分配从1开始的序号:

    # 先按用户、会话、时间排序
    df_sorted = df.sort_values(by=['user_id', 'session_id', 'time'], ascending=True)
    
    # 给每个分组内的记录生成序号(从1开始)
    df_sorted['group_rank'] = df_sorted.groupby(['user_id', 'session_id']).cumcount() + 1
    

    这里cumcount()会给每个分组内的记录从0开始计数,加1后就变成从1开始的序号,方便后续筛选。

  3. 筛选前3条记录
    最后只保留group_rank≤3的记录即可:

    filtered_df = df_sorted[df_sorted['group_rank'] <= 3]
    

效果验证

比如你提到的user_id=123、session_id=36的分组,排序后time更早的记录会排在前面,不管这个组原来有多少条,最终只会保留前3条;如果组内只有2条记录,那这2条都会被保留下来。

简化版(一行搞定)

如果不想额外保留group_rank列,可以直接链式操作:

filtered_df = df.assign(time=pd.to_datetime(df['time'])) \
                .sort_values(['user_id', 'session_id', 'time']) \
                .groupby(['user_id', 'session_id']) \
                .head(3)

这里groupby().head(3)会自动保留每个分组排序后的前3条记录,非常简洁!

内容的提问来源于stack exchange,提问作者add-semi-colons

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:30:24