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

如何用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)

代码说明

  1. 数据预处理:统一缺失值格式,避免字符串'NaN'干扰后续逻辑。
  2. 映射字典:实现O(1)时间复杂度的上下级查找,提升追溯效率。
  3. 迭代追溯逻辑:循环判断当前员工状态,直到触发终止条件:
    • 找到顶级经理:按要求格式拼接结果
    • 上级不属于本公司:确认当前员工为业务线顶级,直接返回
  4. 批量处理:通过apply方法为所有员工自动生成Top Manager值,适配动态更新的员工数据。

输出结果

运行代码后将得到与预期一致的结果,其中修正了原预期输出中1006的顶级经理笔误(1006的直接上级是顶级经理1008,因此顶级经理应为1008)。

内容的提问来源于stack exchange,提问作者alfonsosmdc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:21:01