Python按条件去重问题:招聘场景中候选人和职位互斥的先到先得筛选
解决招聘先到先得的双向锁定筛选问题
问题说明
招聘需遵循先到先得原则:为指定技能、城市的岗位匹配候选人,一旦候选人被某岗位录用,该岗位和候选人均不可参与后续筛选。原代码df.drop_duplicates(['Skill', 'City','Id']).drop_duplicates('Job')无法实现该逻辑,因为它只是静态去重,没有动态锁定已录用的岗位和候选人。
期望输出
Job Skill City Id Job_Id 0 A Science London P1 A_P1 1 B Science London P2 B_P2 4 E Maths London P3 E_P3
实现代码
import pandas as pd # 示例原始数据 data = { 'Job': ['A', 'B', 'C', 'D', 'E'], 'Skill': ['Science', 'Science', 'Science', 'Science', 'Maths'], 'City': ['London', 'London', 'London', 'London', 'London'], 'Id': ['P1', 'P2', 'P1', 'P2', 'P3'], 'Job_Id': ['A_P1', 'B_P2', 'C_P1', 'D_P2', 'E_P3'] } df = pd.DataFrame(data) # 初始化已使用的岗位和候选人集合 used_jobs = set() used_candidates = set() result_rows = [] # 按顺序遍历每一行,动态锁定已录用的岗位和候选人 for _, row in df.iterrows(): current_job = row['Job'] current_candidate = row['Id'] # 仅当岗位和候选人都未被使用时,保留该行并标记为已使用 if current_job not in used_jobs and current_candidate not in used_candidates: result_rows.append(row) used_jobs.add(current_job) used_candidates.add(current_candidate) # 转换为结果DataFrame result_df = pd.DataFrame(result_rows) print(result_df)
代码逻辑解释
- 用两个集合
used_jobs和used_candidates记录已被录用的岗位和候选人,确保不会重复使用。 - 按原始数据的顺序遍历每一行,这保证了先到先得的规则。
- 只有当当前行的岗位和候选人都未被标记为已使用时,才将该行加入结果,并更新两个集合。
- 这种动态筛选的方式,完美实现了“录用后岗位和候选人双向锁定”的需求。
原代码问题分析
原代码的两次drop_duplicates只是做了静态的去重:
- 第一次
drop_duplicates(['Skill', 'City','Id'])是去掉同一技能、城市下重复的候选人,但没考虑岗位是否已被录用。 - 第二次
drop_duplicates('Job')是去掉重复的岗位,但没有动态跟踪已被占用的候选人。 - 这两步都没有按照“先到先得”的顺序动态锁定双方,所以无法得到预期结果。
内容的提问来源于stack exchange,提问作者AB14
相关产品推荐
相关产品推荐

