Как перебрать колонку с помощью панд?

Мой фрейм данных такой

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 ответа

Следующий код должен работать. Но, похоже, в вашем примере нет 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,:] вместо.

Но вы можете использовать встроенную функцию панд, чтобы сделать это более эффективно.

Аллен приводит один такой пример, но если я правильно прочитал проблему, то решение не совсем верное - вы ищете какой-то непрерывный 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
Другие вопросы по тегам