对于每个User_id,我都有一个不同事件的列表。例如,事件1可以由同一用户发生在不同的时间。
我试图做的是找到属于该用户的每个事件的间隔,并找到每个事件的间隔的平均值。
我尝试使用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
然后找到每个事件的时间间隔平均值。
感谢您的帮助。
答案 0 :(得分:0)
假设时间已排序,则可以通过groupby和shift来获取上一个事件的时间
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))