我有一个熊猫数据框,其中包含某些事件的用户ID和日期时间。现在,我想获取每个事件相对于该特定用户的第一个事件发生的相对时间。
user_id date
A 2016-03-02 18:15:43
A 2016-01-10 17:58:57
B 2017-03-22 07:52:00
B 2017-03-27 10:41:00
我找到了一个可行的解决方案,但似乎花费了太多精力。我相信有一种更优雅的方法可以做到这一点。
#get earliest datetime per user
start = lambda x: x.min()
start.__name__ = 'start_date'
min_dates = df.groupby('user_id').agg({'date':[start]})
#merge back to dataframe
df = df.join(min_dates.date['start_date'])
#calulate relative time
df['time_after_start'] = (df['date']-df['start_date']).apply(lambda x: x.days+x.seconds/(24*60*60))
预期结果如下
user_id date time_after_start
A 2017-03-22 07:52:00 0.000000
A 2017-03-27 10:41:00 5.117361
B 2016-03-02 18:15:43 52.011644
B 2016-01-10 17:58:57 0.000000
非常感谢您的帮助!
答案 0 :(得分:2)
将GroupBy.transform
与min
一起用于Series
,其大小与原始DataFrame
相同,然后将时间增量转换为Series.dt.total_seconds
并除以day
s :
s = df.groupby('user_id')['date'].transform('min')
df['time_after_start'] = (df['date']-s).dt.total_seconds()/(24*60*60)
print (df)
user_id date time_after_start
0 A 2016-03-02 18:15:43 52.011644
1 A 2016-01-10 17:58:57 0.000000
2 B 2017-03-22 07:52:00 0.000000
3 B 2017-03-27 10:41:00 5.117361