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