如何用Python对比列中当前行与前一行值并实现员工阶段追踪
员工阶段变更数据处理方案
原始数据集说明
表格包含员工编码(Employee Code)、操作日期(Date)、阶段描述(Stage),已按员工编码、日期从旧到新排序。示例:员工编码111在2022/01/20从stage 1变更为stage 2。
预期实现效果
- 添加
FROM和TO列,分别显示每条记录的上一阶段和下一阶段 - 添加
Status列,标记每条记录是否发生阶段变更 - 添加
Counter列,统计每位员工阶段变更所需的操作次数(同一员工内计数器从1开始计数,如员工111需5次操作)
尝试的代码(未达预期)
import pandas as pd data['Account-Stage'] = data['Employee Code'].map(str) + data['Stage'].map(str) data.sort_values(['Employee Code', 'Date'], ascending=[True, True], inplace=True) grouped = data.groupby('Account-Stage') def rank(x): return x['Date'].rank(method='first').astype(int) data["Counter"] = grouped.apply(rank).reset_index(0, drop=True)
解决方案
1. 生成FROM和TO列
通过分组后位移获取相邻阶段:
# 按员工分组,获取上一阶段(FROM)和下一阶段(TO) data['FROM'] = data.groupby('Employee Code')['Stage'].shift(1) data['TO'] = data.groupby('Employee Code')['Stage'].shift(-1)
2. 标记阶段变更状态
对比当前阶段与上一阶段,生成Status列:
# 默认标记为无变更 data['Status'] = 'No Change' # 当当前阶段与上一阶段不同时,标记为变更(排除每组第一条无前置阶段的记录) mask = (data['Stage'] != data['FROM']) & data['FROM'].notna() data.loc[mask, 'Status'] = 'Changed'
3. 计算阶段内操作计数器
为每个员工的连续阶段创建分组,再在分组内从1开始计数:
# 为每个员工的连续阶段生成唯一分组ID data['stage_group'] = data.groupby('Employee Code')['Stage'].apply(lambda x: x.ne(x.shift()).cumsum()) # 按员工+阶段分组,计算操作次数 data['Counter'] = data.groupby(['Employee Code', 'stage_group']).cumcount() + 1 # 删除临时分组列 data.drop('stage_group', axis=1, inplace=True)
完整整合代码
import pandas as pd # 确保数据按员工编码和日期升序排列 data.sort_values(['Employee Code', 'Date'], ascending=[True, True], inplace=True) # 1. 添加FROM和TO列 data['FROM'] = data.groupby('Employee Code')['Stage'].shift(1) data['TO'] = data.groupby('Employee Code')['Stage'].shift(-1) # 2. 添加Status列 data['Status'] = 'No Change' mask = (data['Stage'] != data['FROM']) & data['FROM'].notna() data.loc[mask, 'Status'] = 'Changed' # 3. 添加Counter列 data['stage_group'] = data.groupby('Employee Code')['Stage'].apply(lambda x: x.ne(x.shift()).cumsum()) data['Counter'] = data.groupby(['Employee Code', 'stage_group']).cumcount() + 1 data.drop('stage_group', axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者cisland_programmer
相关产品推荐
相关产品推荐

