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

基于ID替换员工状态值:Pandas实现问题求助

解决Pandas员工数据集Status字段统一设置问题

需求说明

将每个员工的Status字段统一设置为其最新历史记录的Emp_Status值。

原始数据集

ID    Start_Date     End_Date      Emp_Status
 1     11/23/2021     1/12/2022       Active
 1     1/12/2022      3/1/2022        Active
 1     3/1/2022       7/3/2022        Termed
 2     7/19/2018      10/11/2018      Active
 2     10/11/2018     3/30/2019       Termed
 2     3/30/2022      9/7/2022        Active

期望结果

ID     Start_Date      End_Date     Emp_Status       Status
1      11/23/2021      1/12/2022      Active         Termed
1      1/12/2022       3/1/2022       Active         Termed
1      3/1/2022        7/3/2022       Termed         Termed 
2      7/19/2018       10/11/2018     Active         Active
2      10/11/2018      3/30/2019      Termed         Active
2      3/30/2022       9/7/2022       Active         Active

你的代码问题分析

你尝试的代码存在几个关键问题:

  • replace方法默认不修改原DataFrame,需添加inplace=True参数才会生效,否则仅返回修改后的副本
  • 循环逻辑错误:遍历分组后的tail(1)时,直接对整个DataFrame做替换,会修改所有行而非对应ID的行
  • 最后赋值df['Status'] = df['Emp_Status']直接覆盖了之前操作,导致结果只是复制原列

正确解法

步骤说明

  1. 将日期列转换为datetime类型,确保能正确排序获取最新记录
  2. 按ID分组,每组内按End_Date降序排序,提取每组第一条(最新)的Emp_Status
  3. 用map方法将每个ID对应的最新状态映射到原DataFrame,生成Status列

完整代码

import pandas as pd

# 模拟原始数据
data = {
    'ID': [1,1,1,2,2,2],
    'Start_Date': ['11/23/2021', '1/12/2022', '3/1/2022', '7/19/2018', '10/11/2018', '3/30/2022'],
    'End_Date': ['1/12/2022', '3/1/2022', '7/3/2022', '10/11/2018', '3/30/2019', '9/7/2022'],
    'Emp_Status': ['Active', 'Active', 'Termed', 'Active', 'Termed', 'Active']
}
df = pd.DataFrame(data)

# 转换日期列为datetime类型
df['Start_Date'] = pd.to_datetime(df['Start_Date'])
df['End_Date'] = pd.to_datetime(df['End_Date'])

# 生成ID到最新状态的映射字典
latest_status = df.groupby('ID').apply(
    lambda x: x.sort_values('End_Date', ascending=False).iloc[0]['Emp_Status']
).to_dict()

# 映射生成Status列
df['Status'] = df['ID'].map(latest_status)

# 可选:将日期列转回原格式
df['Start_Date'] = df['Start_Date'].dt.strftime('%m/%d/%Y')
df['End_Date'] = df['End_Date'].dt.strftime('%m/%d/%Y')

print(df)

简化写法(若原始数据已按日期顺序排列)

如果每组的最后一条记录就是最新的,可直接用tail(1)生成映射:

# 生成ID到最新状态的映射
latest_status = df.groupby('ID')['Emp_Status'].tail(1)
latest_status = pd.Series(latest_status.values, index=df['ID'].unique()).to_dict()

# 映射生成Status列
df['Status'] = df['ID'].map(latest_status)

执行效果

运行后会得到你期望的结果,每个ID对应的所有行的Status字段都是该员工最新的Emp_Status值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:39:40