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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:52:40