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

按ID创建值变更标识列:员工角色切换检测实现咨询

问题

需要在DataFrame中按ID创建Switch列,用于标识同一ID下员工的Job角色是否发生切换。

原始数据

ID     Date         Job 
101     05/2022      Sales 
101     06/2022      Sales 
102     12/2021      Tech    
102     1/2022       Tech 
102     2/2022       Finance 
103     4/2022       HR 
103     5/2022       Sales 
103     6/2022       Tech 

期望输出

ID     Date       Job      Switch 
101    05/2022    Sales      No 
101    06/2022    Sales      No 
102    12/2021    Tech       No 
102    01/2022     Tech       No 
102    02/2022     Finance    Yes 
103    04/2022     HR         No 
103    05/2022     Sales      Yes 
103    06/2022     Tech       Yes 

已确定可行思路:从df.groupby('ID')['Job']入手,寻求具体实现建议。


解决方案

核心思路是对每个ID分组后,对比当前行与上一行的Job值是否不同,同时保证同一ID内的记录按时间顺序排列,具体实现如下:

代码实现

import pandas as pd

# 构造原始数据(实际场景可替换为你的数据源读取逻辑)
data = {
    'ID': [101, 101, 102, 102, 102, 103, 103, 103],
    'Date': ['05/2022', '06/2022', '12/2021', '1/2022', '2/2022', '4/2022', '5/2022', '6/2022'],
    'Job': ['Sales', 'Sales', 'Tech', 'Tech', 'Finance', 'HR', 'Sales', 'Tech']
}
df = pd.DataFrame(data)

# 转换日期格式并排序,确保同一ID内记录按时间顺序排列
df['Date'] = pd.to_datetime(df['Date'], format='%m/%Y')
df = df.sort_values(['ID', 'Date']).reset_index(drop=True)

# 生成Switch列:同一ID内当前Job与上一行不同则标记Yes,否则No
df['Switch'] = df.groupby('ID')['Job'].apply(lambda x: x != x.shift()).map({True: 'Yes', False: 'No'})

# 可选:将日期转回原显示格式
df['Date'] = df['Date'].dt.strftime('%m/%Y')

print(df)

关键说明

  1. 日期处理:必须将Date转为datetime类型并排序,否则原始数据中类似1/2022会排在12/2021之后,导致切换判断顺序错误。
  2. 分组对比:groupby('ID')['Job'].apply(lambda x: x != x.shift())会对每个ID的Job列逐行与上一行值对比,返回布尔值(True表示发生切换)。
  3. 值转换:用map把布尔值转为需求的"Yes"/"No",每个ID的第一行因无前置记录,自动标记为"No",完全匹配期望输出。

内容的提问来源于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.22 09:15:28