Как перебрать колонку с помощью панд?
Мой фрейм данных такой
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