簡體   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