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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:52:49