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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:35:19