熊猫数据帧从列中减去组最小值

时间:2019-04-11 08:16:47

标签: python pandas

我有一个熊猫数据框,其中包含某些事件的用户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

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

GroupBy.transformmin一起用于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