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

如何基于另一个DataFrame登记的技能为需求DataFrame分配匹配人员

方案1:字典映射法(推荐,大数据量下性能更好)

仅需遍历一次人员表构建技术到负责人的映射,后续直接匹配即可:

import pandas as pd
import numpy as np

# 你原有的构造代码
censo = pd.DataFrame({"Name":["Uriel","Ricardo","Rodrigo","Arion"], "Tec":[("Sas, Python"),("Python, Pyspark"),("Python, Tableau"),("Excel")]})
tec = pd.DataFrame({"Request":["001","002","003","004"], "Tec":["Python","Sas","Tableau","Excel"]})

# 构建技术到第一个掌握该技术的人员的映射字典
tec_map = {}
for _, person in censo.iterrows():
    techs = person["Tec"].split(", ")
    for t in techs:
        # 仅保存第一个匹配的人员,符合你要"第一个最匹配"的需求
        if t not in tec_map:
            tec_map[t] = person["Name"]

# 直接映射生成新列
tec["Assignment"] = tec["Tec"].map(tec_map)

最终tec输出结果如下:

RequestTecAssignment
001PythonUriel
002SasUriel
003TableauRodrigo
004ExcelArion

方案2:逐请求匹配法(适合小数据量,逻辑直观)

如果数据量很小,也可以直接对每个请求遍历人员表匹配:

def get_match(req_tec):
    for _, person in censo.iterrows():
        if req_tec in person["Tec"]:
            return person["Name"]
    return np.nan

tec["Assignment"] = tec["Tec"].apply(get_match)

原有代码问题说明

你之前的测试代码错误点在于:对censo['Name']执行lambda x: 'Python' in x是判断人员姓名里是否包含Python字符串,和技术列完全无关,因此无法得到正确结果。如果要沿用哑变量的思路,需要对tec里的技术名称取对应哑变量列值为1的第一个Name即可,但性能和可读性都不如上面的映射方案。


内容的提问来源于stack exchange,提问作者Ricardo J. Martínez Suástegui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:54:00