Python Pandas-在至少七天的时间内三天内登录产品的用户

Python Pandas-在至少七天的时间内三天内登录产品的用户,python,pandas,numpy,machine-learning,scikit-learn,Python,Pandas,Numpy,Machine Learning,Scikit Learn,我有一个用于用户参与的数据帧(df),如下所示:- time_stamp | user_id | --------------------------- 2013-01-01 10:05:23 | 1 2013-01-03 16:35:23 | 1 2013-01-06 11:06:35 | 1 2013-01-10 12:05:43 | 1 2013-01-11 13:32:12 | 2 2013-01-04 16:26:34 | 3 2013-01-05 14:02:51

我有一个用于用户参与的数据帧(df),如下所示:-

time_stamp          | user_id |
---------------------------
2013-01-01 10:05:23 | 1
2013-01-03 16:35:23 | 1
2013-01-06 11:06:35 | 1
2013-01-10 12:05:43 | 1
2013-01-11 13:32:12 | 2
2013-01-04 16:26:34 | 3
2013-01-05 14:02:51 | 3
2013-01-11 18:35:53 | 3
2013-01-04 12:26:34 | 4
2013-01-05 13:31:11 | 4
2013-01-12 17:35:52 | 4
每行都是系统的单一登录。采用用户是指在至少七天内三天内登录产品的用户。如何查找所有已采用用户的用户ID


输出是所采用用户的用户ID列表- 用户列表=
['1','3']

提前谢谢

首先按天使用地板,然后按
groupby
使用
rolling
每3行使用一次。但需要数字时会出现问题,因此datetimes会转换为unix时间:

df['time_stamp'] = df['time_stamp'].dt.floor('d').astype(np.int64)
#sorting and remove duplicated days per users 
df = df.sort_values(['user_id', 'time_stamp']).drop_duplicates()

a = df.groupby('user_id')['time_stamp'].rolling(window=3)
b = pd.to_timedelta((a.max()- a.min())).dt.days
print (b)
user_id    
1        0     NaN
         1     NaN
         2     5.0
         3     7.0
2        4     NaN
3        5     NaN
         6     NaN
         7     7.0
4        8     NaN
         9     NaN
         10    8.0
Name: time_stamp, dtype: float64

c = b[b == 7].index.get_level_values('user_id').tolist()
print (c)
[1, 3]

如果
df
包含示例数据框,我将根据给定日期的周数进行计算和分组

import pandas as pd

df = pd.read_csv('data.csv', parse_dates=['ime_stamp'])

df['wk'] = df['ime_stamp'].dt.week
df = df.groupby(['wk','user_id'])['ime_stamp'].count().reset_index(name="freq")

result = df[df.freq >= 3]

# only user ids matching criteria
user_ids = result.user_id.tolist()
print(user_ids)
输出:
[1]

# list of tuples containing user_id and number times logged in
p = [(x,y) for x,y in zip(result.user_id, result.freq) ]
print(p)

输出:
[(1,3)]

输出是已采用用户的用户ID列表-用户ID列表=['1','3','5']…我添加了示例数据,在上面的数据中,它将是['1','3'],用户必须在7天内登录3次不确定dropna是否正常工作,它将给我空白输出。另外,我只需要在7天内登录3次或更多的用户ID。谢谢我有一个大约有1000行的表格,有什么方法可以发送吗?嗯,我有一个主要的问题,如何检查,验证解决方案是否正确?因此,我认为最好是使用
mcve
的30行代码。谢谢。输出还应包含用户_id“3”,因为该用户在“2013-01-04”和“2013-01-11”之间有3次登录,这是一个7天的周期,但是,它不应包含用户_id“4”,因为它超过7天。我们无法使用本周的任何开始,因为我们正在考虑滚动7天。这3个登录可以来自周二到周一或周日到周六,因此任何7天的countOutput都应该是1,3,用户4不包括在内,因为它的3个登录都在8天内,而不是在7天内,但是用户1在7天内有3个登录,所以这很好!第4次登录是在第7天之后,在任何7天中至少有3次登录。这很好,我将做的唯一更改是:-c=b[b<8]。index.get_level_values('user_id')。tolist(),因为它的计数值也应该小于7。谢谢