给出以下结构的数据帧
df1 = pd.DataFrame( data = {'userid':[465,465,999,999,999,999],
'postedDate':[pd.to_datetime('2018-11-01'),pd.to_datetime('2018-11-20'),pd.to_datetime('2018-11-01'),pd.to_datetime('2018-11-08'),pd.to_datetime('2018-11-14'), pd.to_datetime('2018-11-29')],
'value':[1,1,1,1,1,1]}).set_index('postedDate')
df1 = df1.groupby('userid').resample('W').count().drop('userid', axis =1 )
df1
userid postedDate value
465 2018-11-04 1
2018-11-11 0
2018-11-18 0
2018-11-25 1
999 2018-11-04 1
2018-11-11 1
2018-11-18 1
2018-11-25 0
2018-12-02 1
对于每个用户ID,我希望获得最大连续周数(值= 1)。结果应为
userid max_consecutive_wks
465 1
999 3
鉴于数据集的大小,使用 for循环的任何解决方案都无法在Python中运行,因此我正在寻找仅 Pandas / Numpy 的矢量化方法。
答案 0 :(得分:1)
使用移位累积技巧来获取所有连续的1组,然后使用value_counts
查找最大的组。
u = df1['value'].eq(1)
v = u.ne(u.shift()).cumsum().where(u)
v.groupby(level=0).value_counts().max(level=0).reset_index(name='max_consec_wks')
userid max_consec_wks
0 465 1
1 999 3
需要进行where
调用以确保仅考虑1(而不是0)的组。