You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()
)

逻辑说明

  1. 日期排序:先将日期转换为时间格式并排序,保证记录按时间先后顺序处理,这是正确识别岗位变更的前提。
  2. 精准分组:使用EmpID+ManagerPosNum作为分组键,确保只处理同一个员工对应的同一个经理岗位的人员变动,避免跨岗位干扰。
  3. 变更识别与填充:
    • 用shift()获取组内上一条记录的经理名称;
    • 当当前经理与上一条不同时,保留上一条的经理名称(标记岗位曾空缺);
    • 通过ffill()向下填充,让同一岗位下新经理的所有后续记录都带上前任经理的名称。

内容的提问来源于stack exchange,提问作者Coding_Nubie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:40:22