如何使用pandas遍历groupby列?

时间:2018-03-04 00:17:47

标签: python pandas numpy pandas-groupby

我的数据框就像这样

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

2 个答案:

答案 0 :(得分: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)
)

答案 1 :(得分: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