我的数据框是这样的
Numbers, user_id, time_stamp
1 2 2013-11-15 03:45:04
2 2 2013-11-29 03:45:04
3 2 2013-12-09 03:45:04
4 2 2013-12-25 03:45:04
5 2 2013-12-31 03:45:04
6 3 2014-01-08 03:45:04
7 3 2014-02-03 03:45:04
7 4 2014-02-03 03:45:04
我必须找到在至少一周内的三个不同日期访问该网站的user_id。我试过了
def gr (group):
for i in range(1, len(group)-2):
print (group['time_stamp'].ix[i+2] - group['time_stamp'].ix[i] <= pd.Timedelta(days=7))
df.groupby('user_id').apply(gr)
它正确显示了一些值但随后抛出了KeyError:3如何过滤满足条件的所有user_id?谢谢。
以下代码应该有效。但似乎您的示例没有任何满足您条件的user_id。
(
df.assign(year=df.time_stamp.dt.year,
woy=df.time_stamp.dt.weekofyear,
dow=df.time_stamp.dt.dayofweek)
.groupby(['user_id','year','woy'])
.filter(lambda x: x.dow.nunique()>=3)
)
我认为你的代码应该实际工作,除了ix[i]
试图使用索引标签,而不是整数位置。试试.iloc[i,:]
吧。
但是你可以使用内置的pandas函数来更有效地完成这项工作。
艾伦提供了一个这样的例子,但如果我正确地阅读了问题,那么解决方案并不完全正确 - 你正在寻找任何连续7天的时间段,而不仅仅是一年中的特定周。
我认为以下应该有效:
weekly_counts=df.set_index('timestamp').groupby('user_id').rolling('7d')['user_id'].count().rename('count')
weekly_max=weekly_counts.groupby(level='user_id').max()
weekly_max[weekly_max>=3].index