如何在Python中按EmpID查找离职未继任经理的历史信息
员工经理继任空缺标注解决方案
需求说明
处理员工历史数据集,新增Vacated Manager列:
- 若经理职位未发生继任空缺,该列留空
- 若经理离职且职位被其他人员填补(通过
ManagerPositionNum判断:编号唯一对应原经理,其他经理使用该编号则视为填补空缺),则该列标注离职的前任经理;同时原经理在职期间的对应记录也需标注该前任经理。
样本数据
EmpID Date Job_Title ManagerName ManagerPositionNum 101 May 2021 Sales Rep John Doe 1111 101 June 2021 Sales Rep John Doe 1111 102 February 2022 Tech Support Mary Sue 2111 102 March 2022 Tech Support Mary Sue 2111 102 April 2022 Tech Support John Doe 2111 103 October 2022 HR Advisor Sarah Long 3111 103 November 2022 HR Advisor Michael Scott 4111 103 December 2022 HR Advisor John Doe 4111 103 December 2022 HR Advisor John Doe 4111
期望输出
EmpID Date Job_Title ManagerName ManagerPositionNum Vacated Manager 101 May 2021 Sales Rep John Doe 1111 101 June 2021 Sales Rep John Doe 1111 102 February 2022 Tech Support Mary Sue 2111 Mary Sue 102 March 2022 Tech Support Mary Sue 2111 Mary Sue 102 April 2022 Tech Support John Doe 2111 Mary Sue 103 October 2022 HR Advisor Sarah Long 3111 103 November 2022 HR Advisor Michael Scott 4111 103 December 2022 HR Advisor John Doe 4111 Michael Scott 103 December 2022 HR Advisor John Doe 4111 Michael Scott
解决代码与逻辑
代码实现
import pandas as pd # 加载样本数据(实际场景可替换为pd.read_csv读取文件) data = { 'EmpID': [101,101,102,102,102,103,103,103,103], 'Date': ['May 2021','June 2021','February 2022','March 2022','April 2022','October 2022','November 2022','December 2022','December 2022'], 'Job_Title': ['Sales Rep','Sales Rep','Tech Support','Tech Support','Tech Support','HR Advisor','HR Advisor','HR Advisor','HR Advisor'], 'ManagerName': ['John Doe','John Doe','Mary Sue','Mary Sue','John Doe','Sarah Long','Michael Scott','John Doe','John Doe'], 'ManagerPositionNum': [1111,1111,2111,2111,2111,3111,4111,4111,4111] } df = pd.DataFrame(data) # 构建职位编号与原始经理的映射字典(每个编号唯一对应一位经理) manager_position_map = df.drop_duplicates('ManagerPositionNum').set_index('ManagerPositionNum')['ManagerName'].to_dict() # 定义分组处理函数,针对单个员工的所有记录 def process_employee_records(group): # 初始化空缺经理列 group['Vacated Manager'] = None # 按日期排序,确保按时间顺序处理记录 group_sorted = group.sort_values('Date').copy() # 记录每个职位编号是否已出现继任情况 vacated_positions = {} for idx, row in group_sorted.iterrows(): pos_num = row['ManagerPositionNum'] original_manager = manager_position_map[pos_num] # 检查当前员工的该职位编号后续是否有非原始经理的记录(即职位会被继任) future_rows = group_sorted[(group_sorted['ManagerPositionNum'] == pos_num) & (group_sorted.index > idx)] has_successor = not future_rows.empty and (future_rows['ManagerName'] != original_manager).any() # 如果当前经理不是原始经理,标记该职位的空缺经理 if row['ManagerName'] != original_manager: vacated_positions[pos_num] = original_manager # 若职位已被继任,或后续会被继任,填充空缺经理 if pos_num in vacated_positions or has_successor: group_sorted.loc[idx, 'Vacated Manager'] = original_manager return group_sorted # 按员工ID分组处理,生成结果 result_df = df.groupby('EmpID').apply(process_employee_records).reset_index(drop=True) # 打印结果(实际场景可导出为文件) print(result_df.to_string(index=False))
逻辑说明
- 映射构建:利用
ManagerPositionNum与经理的唯一对应关系,生成编号到原始经理的字典,用于快速查询每个职位的归属经理。 - 分组处理:按员工ID分组,确保每个员工的记录独立处理;对每组记录按日期排序,保证时间顺序正确。
- 空缺判断:
- 遍历记录时,检查当前经理是否为职位编号的原始经理,若不是则标记该职位的空缺经理。
- 同时检查该员工后续是否有该职位的继任记录,若有则原始经理在职期间的记录也需标注空缺经理(对应样本中EmpID102的前两条记录)。
- 结果整合:将分组处理后的结果合并,得到符合期望的数据集。
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

