Python-仅对最新日期进行排序

时间:2020-09-16 00:45:22

标签: python pandas

我对Python完全陌生,但是有一个我想使用Python解决的问题。

我正在处理应聘者的求职申请,一些应聘者提交了多个申请,我的目标是将数据集减少到每个应聘者的最新申请。

我的代码如下:

import pandas as pd

data = {'application_date' : ["9/11/2020 10:30:31", "9/11/2020 11:07:59", "9/11/2020 11:09:02", "9/14/2020 13:14:31", "9/14/2020 13:15:15"],
        'candidate_id' : ["001", "002", "002", "002", "002"]
       }

df = pd.DataFrame(data)

df['application_date'] = pd.to_datetime(df['application_date'])

df['rank_application'] = df.groupby('candidate_id')['application_date'].rank(method='first')

这将返回以下内容:

     application_date candidate_id  rank_application
0 2020-09-11 10:30:31          001               1.0
1 2020-09-11 11:07:59          002               1.0
2 2020-09-11 11:09:02          002               2.0
3 2020-09-14 13:14:31          002               3.0
4 2020-09-14 13:15:15          002               4.0

这就是我被困住的地方。从这里开始,我不知道如何仅将df减少到每个候选人ID最新的值。我本来希望按降序排列,然后弄清楚如何在rank_application = 1的情况下取行(但我无法弄清楚)

2 个答案:

答案 0 :(得分:1)

这是您需要的:

import pandas as pd

data = {'application_date' : ["9/11/2020 10:30:31", "9/11/2020 11:07:59", "9/11/2020 11:09:02", "9/14/2020 13:14:31", "9/14/2020 13:15:15"],
        'candidate_id' : ["001", "002", "002", "002", "002"]
       }

df = pd.DataFrame(data)

df['application_date'] = pd.to_datetime(df['application_date'], infer_datetime_format=True)

result = df.iloc[df.groupby('candidate_id')['application_date'].agg(pd.Series.idxmax)]

print(result)

结果:

     application_date candidate_id
0 2020-09-11 10:30:31          001
4 2020-09-14 13:15:15          002

.iloc[]采用一系列索引来获取适当的行。可能需要pd.to_datetime语句来强制application_date成为pd.Series.idxmax工作的合适日期时间格式。

答案 1 :(得分:1)

首先,由于这是排序并在时间数据中进行选择,因此您应该将列转换为pandas date_time,以便pd.to_datetime对pandas进行良好的操作。

然后,您可以通过按df['application_date'].agg(pd.Series.idxmax)选择时间序列中的最大值来选择['application_date']。但是,由于您要查找具有不同ID或等级的最新时间,因此需要添加groupby来帮助为每个ID进行最大选择。

df.groupby('candidate_id')['application_date'].agg(pd.Series.idxmax)

如果要选择申请日期:您可以通过iloc

轻松将它们编入索引
df.iloc[df.groupby('candidate_id')['application_date'].agg(pd.Series.idxmax)]