基于日期连续性筛选Pandas DataFrame分组用户的方法求助
筛选拥有连续N天数据的用户(以15天为例)
我来帮你搞定这个需求!要从Pandas DataFrame里筛选出拥有连续15天数据的用户,我们可以按以下步骤一步步来:
步骤1:确保日期格式正确
首先得把Day列转换成标准的datetime类型,不然没法计算日期差:
import pandas as pd # 先修正你给出的示例数据构造方式(原写法会报错) df = pd.DataFrame( data=[ ['13-01-2018', 1], ['14-01-2018', 2], ['15-01-2018', 3], ['13-02-2018', 1], ['14-02-2018', 2], ['15-02-2018', 3] ], columns=['Day', 'Data'] ) # 添加User_id列(对应你示例里的分组逻辑) df['User_id'] = [0,0,0,1,1,1] # 转换日期格式(匹配你给出的日-月-年格式) df['Day'] = pd.to_datetime(df['Day'], format='%d-%m-%Y')
步骤2:分组计算连续天数
接下来按User_id分组,计算每个用户的最长连续日期段长度:
# 按用户分组,对日期排序后标记连续组 continuous_groups = df.groupby('User_id').apply( lambda x: x.sort_values('Day')['Day'].diff().dt.days.ne(1).cumsum() ).reset_index(name='group') # 统计每个用户的最长连续天数 max_continuous_days = continuous_groups.groupby(['User_id', 'group']).size().groupby('User_id').max() # 筛选出最长连续天数≥15的用户(示例里改成≥3) target_users = max_continuous_days[max_continuous_days >= 3].index.tolist()
步骤3:提取目标用户的所有数据
最后用isin筛选出这些用户的全部行:
result = df[df['User_id'].isin(target_users)] print(result.head())
运行这段代码后,会得到你示例里想要的结果:
Day Data User_id 0 2018-01-13 1 0 1 2018-01-14 2 0 2 2018-01-15 3 0
关键逻辑说明
diff().dt.days.ne(1):判断相邻日期是否相差1天,不连续的地方会返回Truecumsum():把不连续的点作为分组标记,连续的日期会被分到同一个组里- 两次
groupby:先统计每个连续组的天数,再取每个用户的最长连续天数,最后筛选符合条件的用户
如果需要调整连续天数(比如改成15天),只需要把代码里的>=3改成>=15就行啦!
内容的提问来源于stack exchange,提问作者Alpha Beta
相关产品推荐
相关产品推荐

