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

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)

代码逻辑解释

  1. 用两个集合used_jobs和used_candidates记录已被录用的岗位和候选人,确保不会重复使用。
  2. 按原始数据的顺序遍历每一行,这保证了先到先得的规则。
  3. 只有当当前行的岗位和候选人都未被标记为已使用时,才将该行加入结果,并更新两个集合。
  4. 这种动态筛选的方式,完美实现了“录用后岗位和候选人双向锁定”的需求。

原代码问题分析

原代码的两次drop_duplicates只是做了静态的去重:

  • 第一次drop_duplicates(['Skill', 'City','Id'])是去掉同一技能、城市下重复的候选人,但没考虑岗位是否已被录用。
  • 第二次drop_duplicates('Job')是去掉重复的岗位,但没有动态跟踪已被占用的候选人。
  • 这两步都没有按照“先到先得”的顺序动态锁定双方,所以无法得到预期结果。

内容的提问来源于stack exchange,提问作者AB14

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:22:42