Pandas/Python:基于其他列交叉引用创建主管ID新列
解决员工主管ID匹配问题的高效方法
嘿,刚接触Python的话遇到这种映射问题很正常,咱们一步步来搞定它!你的需求本质是把每个员工的主管名字,对应到主管在员工列表里的ID,用map()函数是最简洁高效的方案,比你之前试的np.where或者iloc要省心太多~
步骤拆解
1. 先创建你的示例DataFrame
首先咱们先把你给出的输入数据转换成可运行的代码:
import pandas as pd # 输入DataFrame data = { 'EmployeeName': ['Jim', 'Brittany', 'Todd'], 'ID': [123, 345, 456], 'SupervisorName': ['Brittany', 'Todd', 'Grace'] } df = pd.DataFrame(data)
2. 生成「员工名字→ID」的映射字典
咱们需要先做一个字典,把每个员工的名字和他们的ID绑定起来,这样后续可以直接通过主管名字查ID:
# 创建名字到ID的映射字典 name_to_id = df.set_index('EmployeeName')['ID'].to_dict()
运行后这个字典的内容是:{'Jim': 123, 'Brittany': 345, 'Todd': 456},完美对应咱们要的匹配关系!
3. 用映射字典生成SupervisorID列
接下来直接用map()函数,把SupervisorName列的每个值,替换成字典里对应的ID:
# 添加SupID列(你要的SupervisorID) df['SupID'] = df['SupervisorName'].map(name_to_id)
这里要注意:如果某个主管的名字不在员工列表里(比如你的例子里Todd的主管Grace),对应的SupID会变成NaN(空值)。
4. 过滤掉没有匹配到主管ID的行(可选,匹配你的期望输出)
你的期望输出里没有Todd那一行,因为他的主管不在员工列表里,所以咱们可以把空值的行删掉:
# 去掉SupID为空的行 df = df.dropna(subset=['SupID']).reset_index(drop=True)
最终运行结果
执行完上面的代码后,输出的DataFrame就和你期望的完全一致了:
EmployeeName ID SupervisorName SupID 0 Jim 123 Brittany 345 1 Brittany 345 Todd 456
为什么这个方法更好?
- 比
np.where或者循环遍历要简洁高效,尤其是当你的数据集很大的时候,map()是pandas专门优化过的向量操作,速度快很多 - 代码可读性强,一眼就能看出来是在做名字到ID的映射
- 扩展性好,如果后续要新增员工或者主管,只需要更新原始DataFrame,映射字典会自动更新
内容的提问来源于stack exchange,提问作者ek11222
相关产品推荐
相关产品推荐

