如何在Python中获取同一职位的最后及倒数第二任职者?
问题:获取同一职位的最后一位与倒数第二位任职者
我有一份员工职位数据集,想要查看同一职位的最后一位和倒数第二位任职者。
示例输入数据
ID Date Name Job Job_ID 101 01/2022 Adam Sales 1234 101 02/2022 Adam Sales 1234 101 03/2022 Adam Sales 1234 102 01/2022 Blake Tech 2345 102 02/2022 Blake Tech 2345 102 02/2022 Blake Consultant 3456 103 01/2022 Chris Advisor 4567 103 02/2022 Chris Analyst 5678 103 03/2022 Chris Analyst 5678 104 01/2022 Debbie Consultant 3456 104 02/2022 Debbie Consultant 3456 104 03/2022 Debbie Tech 2345 105 01/2022 Eric Analyst 5678 105 02/2022 Eric Advisor 4567 105 03/2022 Eric Advisor 4567
期望输出
ID Name Job JobID Lastest Prior 101 Adam Sales 1234 Adam Adam 102 Blake Consultant 3456 Blake Debbie 103 Chris Analyst 5678 Chris Eric 104 Debbie Tech 2345 Debbie Blake 105 Eric Advisor 4567 Eric Chris
我已经能通过以下代码获取每个员工当前职位的最后一位任职者:
manager_dict = df.groupby('ID').agg({'Name':'last'}).to_dict()['Name'] df['Latest'] = df['ID'].apply(lambda x: manager_dict[x])
但不知道如何获取同一职位的倒数第二位任职者。
解决方案
核心思路是按职位(Job/Job_ID)分组,追踪每个职位的任职者变更历史,再关联到每个员工的当前职位,提取倒数第二位任职者。具体步骤如下:
1. 提取员工当前职位信息
先从原数据中筛选每个员工的最新职位记录,对应期望输出的基础列:
# 按日期排序,取每个员工的最后一条记录 current_jobs = df.sort_values('Date').groupby('ID').last().reset_index() # 整理列名和字段 current_jobs = current_jobs[['ID', 'Name', 'Job', 'Job_ID']].rename(columns={'Job_ID': 'JobID'})
2. 构建职位任职者历史字典
按职位分组,收集每个职位的所有任职者(去重并按任职时间排序):
# 先按职位和日期排序,确保任职顺序正确 sorted_df = df.sort_values(['Job_ID', 'Date']) # 按职位分组,获取去重后的任职者列表(按时间先后排列) job_history = sorted_df.groupby('Job_ID')['Name'].unique().to_dict()
3. 提取最后一位和倒数第二位任职者
编写函数,根据职位历史提取对应任职者,再批量应用到当前职位数据:
def get_prior_holder(job_id, current_name, history): holders = history.get(job_id, []) # 找到当前任职者在历史列表中的位置 try: idx = holders.tolist().index(current_name) except ValueError: return current_name # 无匹配时返回自身(如示例中101的情况) # 倒数第二位逻辑:如果是首位任职者,返回自身;否则返回前一位 return holders[idx-1] if idx > 0 else current_name # 添加Latest和Prior列 current_jobs['Latest'] = current_jobs['Name'] current_jobs['Prior'] = current_jobs.apply( lambda row: get_prior_holder(row['JobID'], row['Name'], job_history), axis=1 )
4. 最终结果
运行上述代码后,current_jobs即可得到你期望的输出格式。
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

