如何在同一pandas DataFrame中实现类似Vlookup的层级上级姓名查询
实现方案
直接用Series.map()就可以完美替代Excel的VLOOKUP功能,不需要多次merge,也不需要创建独立DataFrame,核心思路是先构建「员工姓名-直接主管」的映射字典,逐层向上查询即可:
完整可运行代码
import pandas as pd # 原始数据集创建 header = ['emp_id','emp_name','emp_manager','emp_org_lvl'] data = [[ 1,'John S' ,'Bob A', 1],[2, 'Bob A', 'Paul P', 2],[3, 'Paul P', 'Charles Y', 3]] df = pd.DataFrame(data, columns=header) # 1、构建姓名到直接主管的映射字典,等价于VLOOKUP的查询范围 name_to_manager = df.set_index('emp_name')['emp_manager'].to_dict() # 2、逐层查询上级主管 df['lvl2_name'] = df['emp_manager'].map(name_to_manager) df['lvl3_name'] = df['lvl2_name'].map(name_to_manager) # 若只需要保留最底层员工(org_lvl=1)的结果,取消注释下一行即可 # df = df[df['emp_org_lvl'] == 1] print(df)
输出结果
| emp_id | emp_name | emp_manager | emp_org_lvl | lvl2_name | lvl3_name |
|---|---|---|---|---|---|
| 1 | John S | Bob A | 1 | Paul P | Charles Y |
| 2 | Bob A | Paul P | 2 | Charles Y | |
| 3 | Paul P | Charles Y | 3 |
多层级自动化实现
如果组织层级不止3级,不需要手动写每一层的查询代码,可以用循环自动生成所有层级的主管字段:
# 可根据实际组织最大层级调整数值 max_level = 3 current_col = 'emp_manager' for lvl in range(2, max_level+1): col_name = f'lvl{lvl}_name' df[col_name] = df[current_col].map(name_to_manager) current_col = col_name
方法说明
map()方法和Excel VLOOKUP逻辑完全一致:传入的字典就是查询区域,key是查询值,value是返回结果- 全程只需要操作1个原始DataFrame,不需要额外创建辅助表,性能远高于多次merge
内容的提问来源于stack exchange,提问作者mmera
相关产品推荐
相关产品推荐

