Pandas技术问题:筛选4天窗口内有2次访问的用户ID
解决思路与修正代码
你的需求是找出存在至少两次访问间隔在4天窗口内的用户ID,原代码没得到正确结果主要有两个核心问题:一是日期列还是字符串格式,Pandas无法识别为时间维度来计算窗口;二是rolling窗口的逻辑没有基于正确的时间类型执行。下面是具体的修正方案:
方案一:计算相邻日期差值(直观高效)
这个方法直接针对"两次访问间隔≤4天"的核心需求,逻辑更清晰:
import pandas as pd # 先把字符串日期转为Pandas可识别的datetime类型 df['date_of_visit'] = pd.to_datetime(df['date_of_visit'], format='%m/%d/%y') # 按用户分组,检查是否存在相邻访问间隔≤4天的情况 target_users = df.groupby('user_id').filter( lambda x: (x['date_of_visit'].sort_values().diff().dt.days <= 4).any() ).user_id.unique() print(target_users) # 输出: [1]
方案二:修正rolling窗口逻辑(适配你的原思路)
如果想沿用rolling的思路,需要先修复日期类型问题,同时调整窗口参数:
import pandas as pd # 转换日期格式是前提 df['date_of_visit'] = pd.to_datetime(df['date_of_visit'], format='%m/%d/%y') # 分组后先排序日期,再用时间窗口检查是否有≥2条记录的情况 target_users = df.groupby('user_id').filter( lambda x: x.sort_values('date_of_visit') .set_index('date_of_visit') .rolling('4D') # 大写D表示自然日,小写d是工作日,这里用大写更符合需求 .count() .gt(1) .any() ).user_id.unique() print(target_users) # 输出: [1]
原代码失效的原因
- 日期类型错误:
date_of_visit是字符串时,set_index后的索引是字符串序列,rolling('4d')无法解析为时间窗口,只会按行号做滑动窗口,完全偏离了时间间隔的计算逻辑。 - 未排序日期:如果用户的访问日期未排序,rolling窗口的计算顺序会混乱,导致错误的计数结果。
内容的提问来源于stack exchange,提问作者anon_swe
相关产品推荐
相关产品推荐

