Python 查找最大连续天数
下面的代码按键对数据帧进行分组Python 查找最大连续天数,python,pandas,dataframe,Python,Pandas,Dataframe,下面的代码按键对数据帧进行分组 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
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())
详情:
-一级分组(按id)df.groupby('id')
-二级分组(按序列) 连续日期的grp.groupby(…)
-上一行的日期grp.date.shift()
-移位1天+pd.Timedelta(1,'d')
-不等于当前日期。结果为 是一个序列,在每个序列的开始处为True 连续日期!=grp.date
-将上述(bool)系列转换为系列 of int-上述序列的连续数,从 从1cumsum()
-从每个(第二级)组中获取id列id
-计算当前组的大小count()
-从二级组的大小中获取最大值 (在当前级别1组内).max()
1
。这是故意的吗?不,这不是故意的。这是从结果集中得出的。它与实际数据无关。@QuangHoang我刚取出来是的。这是第二级分组(按连续日期的顺序)。我认为它可能太慢了