如何使用Python查找具有相同ID的下一个日期?

时间:2018-10-05 09:52:10

标签: python-3.x pandas

我有一个招聘审核表,其中包含诸如 Applicant_ID,状态 DateTime (带有申请人获得该状态的日期和时间的时间戳)和 Active_Status < / strong>(对/错)。

问题是我没有状态更改的时间戳列。

我要这样做的是:

对于 Active_Status 为False的每一行,我想查找具有相同 Applicant_ID 的行,并返回 DateTime 值,是新行中的下一行(大于actve行的 DateTime 值,但其他行中的最小值)。

我将不得不一次又一次地使用具有相同结构且包含约15万行的表。

数据集示例:

Applicant_ID  Active_Status    Status    DateTime
 42830           True         Rejected   2018.08.06. 11:33:47 
 42830           False        Status1    2018.07.14. 6:46:04 
 42831           False        Status1    2018.07.14. 8:25:22 
 42831           True         Rejected   2018.08.06. 15:08:58 
 42832           False        Status1    2018.07.14. 9:03:37 
 42832           False        No         2018.07.16. 8:25:12 
 42832           True         Rejected   2018.08.31. 13:44:30

我想创建什么:

Applicant_ID  Active_Status    Status    DateTime                 Changed
 42830           True         Rejected   2018.08.06. 11:33:47     Active
 42830           False        Status1    2018.07.14. 6:46:04      2018.08.06. 11:33:47
 42831           False        Status1    2018.07.14. 8:25:22      2018.08.06. 15:08:58
 42831           True         Rejected   2018.08.06. 15:08:58     Active
 42832           False        Status1    2018.07.14. 9:03:37      2018.07.16. 8:25:12 
 42832           False        No         2018.07.16. 8:25:12      2018.08.31. 13:44:30 
 42832           True         Rejected   2018.08.31. 13:44:30     Active

1 个答案:

答案 0 :(得分:0)

看看[Pandas shift功能] [1]

首先,您应该使用看日期的字符串对列进行标准化。

from dateutil.parser import parse
df['DateTime'] = df['DateTime'].apply(parse)

对值进行排序并为每个组应用移位功能

df = df.sort_values(by=['Applicant_ID', 'DateTime'])
df['Changed'] = df.groupby('Applicant_ID').DateTime.shift(-1)

结果:

Applicant_ID    Active_Status   Status  DateTime            Changed
1      42830    False      Status1      2018-07-14 06:46:04 2018-08-06 11:33:47
0      42830    True       Rejected     2018-08-06 11:33:47 NaT
2      42831    False      Status1      2018-07-14 08:25:22 2018-08-06 15:08:58
3      42831    True       Rejected     2018-08-06 15:08:58 NaT
4      42832    False      Status1      2018-07-14 09:03:37 2018-07-16 08:25:12
5      42832    False      No           2018-07-16 08:25:12 2018-08-31 13:44:30
6      42832    True       Rejected     2018-08-31 13:44:30 NaT