Python中如何在DataFrame实现类似Excel的VLOOKUP功能
pandas实现员工表匹配上级ID方案
这个需求本质是按姓名做键值匹配,pandas里有两种非常成熟的实现方式,比Excel VLOOKUP更稳定,不会出现引用范围偏移的问题。
先给测试用的样例数据结构:
import pandas as pd # 示例员工表 df = pd.DataFrame({ 'Employee ID': [101, 102, 103, 104, 105], 'Employee Name': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', 'Sun Qi'], 'Manager Name': ['Li Si', 'Wang Wu', 'Zhao Liu', 'Sun Qi', 'Zhang San'] })
方法1:map映射(数据量大优先选,性能最好)
核心逻辑是先构建「员工姓名→员工ID」的键值对映射,直接对Manager Name列做批量查找,代码最简洁,跑数速度最快。
# 生成姓名与工号的映射字典 name_to_id = df.set_index('Employee Name')['Employee ID'].to_dict() # 直接生成上级ID列 df['Manager ID'] = df['Manager Name'].map(name_to_id)
注意:如果公司存在重名员工,这个方法会默认取最后一次出现的重名员工ID,这类场景建议用工号这类唯一标识做匹配键,避免匹配错误。
方法2:merge左连接(和VLOOKUP逻辑完全对齐,易扩展)
逻辑和Excel VLOOKUP完全一致:把员工姓名、工号单独作为查找表,按Manager Name做左关联匹配,后续如果需要同时提取上级的部门、职级等其他字段,用这个方法可以一次性匹配完成,不用多次写查找逻辑。
# 构造查找参照表 ref_df = df[['Employee Name', 'Employee ID']].rename(columns={'Employee ID': 'Manager ID'}) # 左连接匹配 df = df.merge( ref_df, left_on='Manager Name', right_on='Employee Name', how='left' ).drop(columns=['Employee Name_y']).rename(columns={'Employee Name_x': 'Employee Name'})
两种方法最终效果完全一致,如果出现上级不在当前员工列表、姓名拼写错误的情况,对应Manager ID位置会返回NaN,和Excel VLOOKUP返回#N/A的逻辑相同,可以按需做缺失值填充或者异常校验。
内容的提问来源于stack exchange,提问作者Karthik P H
相关产品推荐
相关产品推荐

