如何用Pandas/Numpy实现类似Excel XLOOKUP的层级经理追溯?
问题描述
现有员工数据表包含Employee ID、Manager ID、Boolean(由pd.isin生成)、Top Manager字段,另有动态更新的顶级经理目录df_top_managers。需要为每位员工自动追溯其顶级经理,覆盖两种场景:
- 直接上级即为顶级经理
- 多层级上报至顶级经理
当前硬编码方案需手动修改,无法适配动态更新;模拟Excel XLOOKUP的自定义函数仅能获取上一级经理,无法完成跨层级追溯。请求用Pandas、Numpy实现解决方案,示例数据及预期输出如下:
import pandas as pd # 顶级经理的上级属于集团总部,不在本公司员工范围内 df_top_managers = pd.DataFrame.from_dict( { 'Employee ID': ['1007', '1008'], 'Manager ID': ['1009', '1009'] } ) # 员工1009不属于本公司,用它代替NaN值 # 需要填充Top Manager列的NaN为正确的顶级经理ID # 业务负责人是1007和1008 df = pd.DataFrame.from_dict( { 'Employee ID': ['1001', '1002', '1003', '1004','1005','1006','1007','1008'], 'Manager ID': ['1005', '1003', '1008', '1006','1007','1008','1009','1009'], 'Boolean': ['False', 'False', 'True', 'False','True','True','True','True'], 'Top Manager': ['NaN', 'NaN', 'NaN', 'NaN','NaN','NaN','NaN','NaN'] } ) print(df)
预期输出:
# 员工与顶级经理之间可能存在多个层级,以下仅为示例 Employee ID Manager ID Boolean Top Manager (expected output) 1001 1005 False 1007 1002 1003 False 1008 1003 1008 True 1008 1004 1006 False 1007 1005 1007 True 1007 1006 1008 True 1008 1007 1009 True 1009 (1007) 1008 1009 True 1009 (1008)
解决方案
通过迭代方式逐级追溯员工上级,直到找到顶级经理或集团总部人员,实现动态适配的自动追溯:
import pandas as pd # 预处理:将字符串'NaN'转为Pandas标准缺失值 df['Top Manager'] = df['Top Manager'].replace('NaN', pd.NA) # 构建员工ID到经理ID的快速映射字典 emp_manager_map = df.set_index('Employee ID')['Manager ID'].to_dict() # 提取顶级经理ID集合 top_manager_ids = set(df_top_managers['Employee ID']) def trace_top_manager(emp_id): current_id = emp_id while True: # 若当前是顶级经理,按格式返回上级ID+自身ID if current_id in top_manager_ids: manager_id = emp_manager_map[current_id] return f"{manager_id} ({current_id})" if manager_id not in emp_manager_map else current_id # 若当前上级不在本公司员工列表,说明已到集团总部,返回当前员工(业务线顶级) if current_id not in emp_manager_map: return current_id # 否则继续向上追溯 current_id = emp_manager_map[current_id] # 批量计算所有员工的顶级经理 df['Top Manager'] = df['Employee ID'].apply(trace_top_manager) print(df)
代码说明
- 数据预处理:统一缺失值格式,避免字符串'NaN'干扰后续逻辑。
- 映射字典:实现O(1)时间复杂度的上下级查找,提升追溯效率。
- 迭代追溯逻辑:循环判断当前员工状态,直到触发终止条件:
- 找到顶级经理:按要求格式拼接结果
- 上级不属于本公司:确认当前员工为业务线顶级,直接返回
- 批量处理:通过
apply方法为所有员工自动生成Top Manager值,适配动态更新的员工数据。
输出结果
运行代码后将得到与预期一致的结果,其中修正了原预期输出中1006的顶级经理笔误(1006的直接上级是顶级经理1008,因此顶级经理应为1008)。
内容的提问来源于stack exchange,提问作者alfonsosmdc
相关产品推荐
相关产品推荐

