Python 查找最大连续天数

Python 查找最大连续天数,python,pandas,dataframe,Python,Pandas,Dataframe,下面的代码按键对数据帧进行分组 df = pd.DataFrame(data, columns=['id', 'date', 'cnt']) df['date']= pd.to_datetime(df['date']) for c_id, group in df.groupby('id'): print(c_id) print(group) 这会产生如下结果: id date cnt 1 2019-01-02 1

下面的代码按键对数据帧进行分组

 df = pd.DataFrame(data, columns=['id', 'date', 'cnt'])
 df['date']= pd.to_datetime(df['date']) 
 for c_id, group in df.groupby('id'):
        print(c_id)
        print(group)
这会产生如下结果:

    id       date  cnt
    1 2019-01-02    1
   1 2019-01-03    2
   1 2019-01-04    3
   1 2019-01-05    1
   1 2019-01-06    2
   1 2019-01-07    1

    id       date      cnt
    2 2019-01-01   478964
    2 2019-01-02   749249
   2 2019-01-03  1144842
   2 2019-01-04  1540846
   2 2019-01-05  1444918
   2 2019-01-06  1624770
   2 2019-01-07  2227589

    id       date     cnt
    3 2019-01-01   41776
   3 2019-01-02   82322
   3 2019-01-03   93467
   3 2019-01-04   56674
   3 2019-01-05   47606
   3 2019-01-06   41448
   3 2019-01-07  145827


    id       date     cnt
    4 2019-01-01   41776
   4 2019-01-02   82322
   4 2019-01-06   93467
   4 2019-01-07   56674
从这个结果中,我想找到每个id的最大连续天数。因此,id 1为6,id 2为7,id 3为7,id 4为2。

使用:

m = (df.assign(date=pd.to_datetime(df['date'])) #if necessary convert else drop
       .groupby('id')['date']
       .diff()
       .gt(pd.Timedelta('1D'))
       .cumsum())
df.groupby(['id', m]).size().max(level='id')
输出

id
1    6
2    7
3    7
4    2
dtype: int64

要获得结果,请运行:

result = df.groupby('id').apply(lambda grp: grp.groupby(
    (grp.date.shift() + pd.Timedelta(1, 'd') != grp.date).cumsum())
    .id.count().max()) 
详情:

  • df.groupby('id')
    -一级分组(按id)
  • grp.groupby(…)
    -二级分组(按序列) 连续日期的
  • grp.date.shift()
    -上一行的日期
  • +pd.Timedelta(1,'d')
    -移位1天
  • !=grp.date
    -不等于当前日期。结果为 是一个序列,在每个序列的开始处为True 连续日期
  • cumsum()
    -将上述(bool)系列转换为系列 of int-上述序列的连续数,从 从1
  • id
    -从每个(第二级)组中获取id列
  • count()
    -计算当前组的大小
  • .max()
    -从二级组的大小中获取最大值 (在当前级别1组内)

在第3组和第4组中有一个重复的索引
1
。这是故意的吗?不,这不是故意的。这是从结果集中得出的。它与实际数据无关。@QuangHoang我刚取出来是的。这是第二级分组(按连续日期的顺序)。我认为它可能太慢了