繁体   English   中英

查找最大连续天数

[英]Find max number of consecutive days

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

 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 )系列转换为一系列int - 上述序列的连续数字,从 1 开始。
  • id - 从每个(第二级)组中获取id列。
  • count() - 计算当前组的大小。
  • .max() - 从第二级组的大小中取最大值(在当前的 1 级组内)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM