如果在连续7天的间隔内出现次数大于x,则熊猫进行计数

时间:2019-02-22 07:23:26

标签: python pandas

我有一个time_stampuser_id的数据。

数据按user_idtime_stamp排序。

我想在7天的滚动间隔中为每个user_id获取该7天的滚动间隔中的访问次数。如果访问次数> 3,则将该用户ID的新列设置为1,否则设置为0。

我的数据

time_stamp,user_id,visited
2014-04-22 03:53:30,1,1
2013-11-15 03:45:04,2,1
2013-11-29 03:45:04,2,1
2013-12-09 03:45:04,2,1
2013-12-25 03:45:04,2,1
2013-12-31 03:45:04,2,1
2014-01-08 03:45:04,2,1
2014-02-03 03:45:04,2,1 <- in a 7 day interval (till 2014-02-10)
2014-02-08 03:45:04,2,1 <- there is 3 visits
2014-02-09 03:45:04,2,1 <-

预期输出

user_id outcome
1       0
2       1

我尝试过的事情:

我不知道执行此操作的最佳方法。我的第一个想法是为每个user_id获得连续的时差。

df['timediff'] = df.groupby(['user_id','time_stamp'])['time_stamp'].diff() / np.timedelta64(1, 'D')

但是此输出显示了所有Nan。

    2014-04-22 03:53:30 1   1   NaN
1   2013-11-15 03:45:04 2   1   NaN
2   2013-11-29 03:45:04 2   1   NaN
3   2013-12-09 03:45:04 2   1   NaN
4   2013-12-25 03:45:04 2   1   NaN

我应该如何更改算法?

1 个答案:

答案 0 :(得分:3)

如果每个user_id都有一个序列号,我将使用df.rolling,其偏移量为7天。然后,您可以检查序列中是否有任何地方的滚动总和为greater than or equal to3。要获得每个用户的序列,请使用set_index()unstack

(df.set_index(['time_stamp', 'user_id'])
.unstack()
.rolling('7D')
.sum()
.ge(3)
.any())

#         user_id
#visited  1          False
#         2           True