按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)
关键说明
- 日期处理:必须将
Date转为datetime类型并排序,否则原始数据中类似1/2022会排在12/2021之后,导致切换判断顺序错误。 - 分组对比:
groupby('ID')['Job'].apply(lambda x: x != x.shift())会对每个ID的Job列逐行与上一行值对比,返回布尔值(True表示发生切换)。 - 值转换:用
map把布尔值转为需求的"Yes"/"No",每个ID的第一行因无前置记录,自动标记为"No",完全匹配期望输出。
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

