Python按ID批量标记员工岗位与部门异动状态
解决按ID批量标记岗位部门同时异动的问题
原代码问题修正
你的原代码存在几处语法错误,先修正基础判断逻辑:
- 列索引错误:
['Adjusted_Code']和['Adjusted Department']需改为df['Adjusted_Code']和df['Adjusted Department'] - 运算优先级问题:
&的优先级高于!=,必须给每个比较条件单独加括号
修正后的单条记录判断代码:
import numpy as np import pandas as pd # 先标记单条记录是否满足同时换岗换部门的条件 df['is_transition'] = np.where( (df['Job_Code'] != df['Adjusted_Code']) & (df['Department'] != df['Adjusted Department']), 'Yes', 'No' )
实现按ID批量标记需求
要达成只要ID存在至少一次符合条件的异动,该ID所有行的Transition都设为Yes的目标,用groupby+transform可以高效实现:
方法一:一步生成最终结果
无需临时列,直接按ID分组判断:
df['Transition'] = df.groupby('ID').transform( lambda group: 'Yes' if ((group['Job_Code'] != group['Adjusted_Code']) & (group['Department'] != group['Adjusted Department'])).any() else 'No' )
方法二:基于临时列批量更新
如果已经生成了is_transition临时列,可简化为:
# 利用"Yes"字符串排序优先级高于"No"的特性,取每组最大值 df['Transition'] = df.groupby('ID')['is_transition'].transform('max') # 或者用any()明确判断 df['Transition'] = df.groupby('ID')['is_transition'].transform(lambda x: 'Yes' if (x == 'Yes').any() else 'No')
最终输出示例
用你的测试数据运行后,结果会变为:
ID Job_Code Adjusted_Code Job_Title Adjusted_Job Department Adjusted_Department Transition 1 327 362 Associate Manager Sales Sales No 1 327 362 Associate Manager Sales Sales No 1 362 362 Associate Manager Sales Sales No 2 358 455 Consult Advisor HR Finance Yes 2 455 455 Advisor Advisor Finance Finance Yes 2 455 455 Advisor Advisor Finance Finance Yes 3 215 381 Manager Director Tech Sales Yes 3 215 381 Manager Director Tech Sales Yes 3 215 381 Manager Director Tech Sales Yes 3 381 381 Manager Director Sales Sales Yes
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

