如何基于另一个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输出结果如下:
| Request | Tec | Assignment |
|---|---|---|
| 001 | Python | Uriel |
| 002 | Sas | Uriel |
| 003 | Tableau | Rodrigo |
| 004 | Excel | Arion |
方案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
相关产品推荐
相关产品推荐

