我对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的情况下取行(但我无法弄清楚)
答案 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)]