如何用Python识别员工数据中的空缺管理岗位
识别空缺经理岗位的正确实现方法
问题说明
之前的代码仅在少量测试用例中有效,扩展到更多场景后失效。需求是基于员工岗位汇报历史数据,通过ManagerPosNum列识别空缺岗位:当同一ManagerPosNum下ManagerName发生变更时,说明该岗位曾处于空缺状态,新接手人员的所有记录需标记出之前的经理名称。
样本数据
EmpID Date ManagerName ManagerID ManagerPosNum 101 May 2022 Adam 201 1111 101 June 2022 Adam 201 1111 102 February 2021 James 301 2222 102 March 2021 James 301 2222 102 April 2021 Adam 201 2222 102 May 2021 Adam 201 2222 103 August 2022 Mary 401 3333 103 September 2022 Adam 201 3333 103 October 2022 Adam 201 3333 103 November 2022 Paul 501 4444
期望输出
EmpID Date ManagerName ManagerID ManagerPosNum VacantManager 101 May 2022 Adam 201 1111 101 June 2022 Adam 201 1111 102 February 2021 James 301 2222 102 March 2021 James 301 2222 102 April 2021 Adam 201 2222 James 102 May 2021 Adam 201 2222 James 103 August 2022 Mary 401 3333 103 September 2022 Adam 201 3333 Mary 103 October 2022 Adam 201 3333 Mary 103 November 2022 Paul 501 4444
失效代码
df['Vacant Manager'] = (df.groupby('EmpID', group_keys = False)['ManagerID'] .apply(lambda s:s.where(pd.factorize (s[::-1])[0][::-1] == 1).ffill())
正确解决方案
代码实现
import pandas as pd # 转换日期格式并按员工和时间排序,确保历史顺序正确 df['Date'] = pd.to_datetime(df['Date'], format='%B %Y') df = df.sort_values(['EmpID', 'Date']).reset_index(drop=True) # 按员工ID+经理岗位编号分组,处理岗位人员变更 df['VacantManager'] = df.groupby(['EmpID', 'ManagerPosNum'], group_keys=False).apply( lambda group: # 获取上一条记录的经理名称 group['ManagerName'].shift() # 仅当当前经理与上一条不同时保留上一条名称,否则设为None .where(group['ManagerName'] != group['ManagerName'].shift()) # 向下填充,让同一岗位下的新经理记录都标记前任经理 .ffill() )
逻辑说明
- 日期排序:先将日期转换为时间格式并排序,保证记录按时间先后顺序处理,这是正确识别岗位变更的前提。
- 精准分组:使用
EmpID+ManagerPosNum作为分组键,确保只处理同一个员工对应的同一个经理岗位的人员变动,避免跨岗位干扰。 - 变更识别与填充:
- 用
shift()获取组内上一条记录的经理名称; - 当当前经理与上一条不同时,保留上一条的经理名称(标记岗位曾空缺);
- 通过
ffill()向下填充,让同一岗位下新经理的所有后续记录都带上前任经理的名称。
- 用
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

