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
相关产品推荐
相关产品推荐

