给定以下结构的数据框

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的矢量化方法。

最佳答案

使用移位的累积技巧来获取所有连续的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)的组。

关于python - 计算每组连续的1个最大数目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54207869/

10-10 08:11