如何使用pandas遍历groupby列?

问题描述 投票:0回答:2

我的数据框是这样的

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?谢谢。

python pandas numpy pandas-groupby
2个回答
1
投票

以下代码应该有效。但似乎您的示例没有任何满足您条件的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)
)

0
投票

我认为你的代码应该实际工作,除了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
© www.soinside.com 2019 - 2024. All rights reserved.