[英]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.