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

Python Pandas:按多列分组筛选满足时间差阈值的行

问题描述

假设有如下Pandas DataFrame:

user            time           session         time_diff
0   21.0    2022-12-16 14:03:08        5           NaN
1   21.0    2022-12-16 14:03:10        5           2.0
2   21.0    2022-12-16 14:03:12        6           2.0
3   21.0    2022-12-16 14:03:13        6           1.0
4   21.0    2022-12-28 14:49:54        16          1039601.0
5   30.0    2022-12-16 14:03:16        5           1039598.0
6   30.0    2022-12-16 14:03:18        5           2.0
7   30.0    2022-12-16 14:03:20        6           2.0

需要筛选出同一user和session下,time_diff(秒级)小于等于10秒的行,预期输出如下:

user            time           session         time_diff
1   21.0    2022-12-16 14:03:10        5           2.0
3   21.0    2022-12-16 14:03:13        6           1.0
6   30.0    2022-12-16 14:03:18        5           2.0

尝试过逐行遍历但效率低,用df.groupby(['user', 'session']).filter(lambda x: (x.time_diff <= 10).any())也无法得到预期结果,求正确实现方法。

解决方案

你用groupby.filter的逻辑错了:这个方法会保留整个分组的所有行,只要该分组里存在至少一行满足条件。但你需要的是保留分组内单独符合条件的行,而非整个组的所有行。

直接用布尔索引就能解决问题,不需要分组筛选:

threshold = 10
result = df[(df['time_diff'] <= threshold) & (~df['time_diff'].isna())]

或者更简洁的写法:

result = df[df['time_diff'].le(10).fillna(False)]

执行后就能得到你想要的预期输出。

这里不需要额外按user和session分组,因为time_diff本身就是基于同一用户同一会话的时间差计算出来的,直接筛选time_diff的条件就已经满足“同一user和session下”的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:04:59