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

基于日期连续性筛选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天,不连续的地方会返回True
  • cumsum():把不连续的点作为分组标记,连续的日期会被分到同一个组里
  • 两次groupby:先统计每个连续组的天数,再取每个用户的最长连续天数,最后筛选符合条件的用户

如果需要调整连续天数(比如改成15天),只需要把代码里的>=3改成>=15就行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:36:48