Для каждого User_id я получил список различных событий. Например, event1 может происходить в разное время одним и тем же пользователем.
Что я пытался сделать, так это найти интервал для каждого события, принадлежащего этому пользователю, и найти среднее значение этих интервалов для каждого события.
Я попытался использовать groupby (['user_id','events'])['time'] и функцию агрегации, но результат был не таким, как я хотел.
User_id events time
1 A 2012-11-24 09:30:00
1 A 2012-11-24 11:50:00
1 B 2012-11-24 12:15:00
1 B 2012-11-24 16:22:00
1 C 2012-11-24 16:23:40
1 D 2012-11-25 05:20:00
1 B 2012-11-25 05:24:00
1 A 2012-11-25 15:00:00
2 A 2012-12-20 01:00:00
ожидаемый результат:
User_id events time interval
1 A 2012-11-24 09:30:00 0
A 2012-11-24 11:50:00 2h20m
A 2012-11-25 15:00:00 27h10m
B 2012-11-24 12:15:00 0
B 2012-11-24 16:22:00 4h7m
B 2012-11-25 05:24:00 13h2m
а затем найти среднее значение этих интервалов для каждого события.
Любая помощь приветствуется.
Предполагая, что время отсортировано, вы можете получить предыдущее время события, выполнив группировку и сдвиг
df.groupby(['User_id', 'events']).time.shift())
0 NaT
1 2012-11-24 09:30:00
2 NaT
3 2012-11-24 12:15:00
4 NaT
5 NaT
6 2012-11-24 16:22:00
7 2012-11-24 11:50:00
8 NaT
Вы можете вычесть время из предыдущего времени, чтобы получить «прошедшее» время, которое вы ищете.
>>> df.time - df.groupby(['User_id', 'events']).time.shift()
0 NaT
1 0 days 02:20:00
2 NaT
3 0 days 04:07:00
4 NaT
5 NaT
6 0 days 13:02:00
7 1 days 03:10:00
8 NaT
Похоже, вы определяете первый интервал как 0, что вы можете сделать с fillna. Вы можете вставить это обратно в фрейм данных, чтобы получить ожидаемые результаты.
df['interval'] = (df.time - df.groupby(['User_id', 'events']).time.shift()).fillna(pd.Timedelta(0))