【问题标题】:Find max number of consecutive days查找最大连续天数
【发布时间】:2020-10-19 18:01:45
【问题描述】:

下面的代码按一个键对数据框进行分组。

 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。

【问题讨论】:

  • 第 3 组和第 4 组中存在重复索引 1。这是故意的吗?
  • 不,这不是故意的。那是来自结果集。它与实际数据无关。
  • @QuangHoang 我刚拿出来

标签: python pandas dataframe


【解决方案1】:

用途:

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

【讨论】:

    【解决方案2】:

    要获得结果,请运行:

    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 - 不等于当前日期。结果 是一个 Series,每个序列的开头都有 True 连续日期。
    • cumsum() - 将上述 (bool) Series 转换为 Series of int - 上述序列的连续数,开始 从 1 开始。
    • id - 从每个(第二级)组中获取 id 列。
    • count() - 计算当前组的大小。
    • .max() - 从二级组的大小中获取 max (在当前的 1 级组内)。

    【讨论】:

    • 是的。这是第二级分组(按连续日期的顺序)。
    • 我觉得可能太慢了
    猜你喜欢
    • 2022-07-19
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多