基于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']直接覆盖了之前操作,导致结果只是复制原列
正确解法
步骤说明
- 将日期列转换为datetime类型,确保能正确排序获取最新记录
- 按
ID分组,每组内按End_Date降序排序,提取每组第一条(最新)的Emp_Status - 用
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
相关产品推荐
相关产品推荐

