如何将数据集中员工的主管ID替换为对应最高层级团队负责人ID?
员工团队负责人映射问题
示例数据集
| emp_id | sup_id |
|---|---|
| 1 | N/A |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 3 |
| 7 | N/A |
| 8 | 7 |
| 9 | 7 |
| 10 | 9 |
| 11 | 19 |
需求说明
将每位员工映射到对应的最高层级主管(团队负责人,以sup_id=N/A标识):
- 员工4-6需映射到1(而非直接上级2或3)
- 员工8、9、10需映射到7
- 员工11因上级19不在数据集中,无法关联到团队负责人,保留原
sup_id值
原代码问题分析
原递归函数未成功运行,核心问题如下:
- 列名不匹配:数据集列名为
emp_id/sup_id,但代码中使用employee_id/supervisor_id,导致无法读取数据 - 终止条件错误:代码判断
supervisor_id != 'NA',但实际数据中团队负责人的sup_id是N/A,递归终止逻辑失效 - 返回值逻辑错误:团队负责人应返回自身ID,而非
N/A,否则映射结果不符合需求 - 无效递归未处理:未判断上级ID是否存在于数据集中,可能导致不必要的递归调用
修正后的代码
import pandas as pd def map_to_project_lead(employee_df, employee_id): # 定位当前员工的行 emp_row = employee_df[employee_df['emp_id'] == employee_id] if emp_row.empty: return None supervisor_id = emp_row['sup_id'].iloc[0] # 当前员工是团队负责人,返回自身ID if supervisor_id == 'N/A': return employee_id # 上级ID不存在于数据中,返回None elif supervisor_id not in employee_df['emp_id'].values: return None # 递归查找上级的团队负责人 else: return map_to_project_lead(employee_df, supervisor_id) def map_supervisors_to_project_lead(df): result_df = df.copy() for index, row in result_df.iterrows(): mapped_lead = map_to_project_lead(df, row['emp_id']) # 仅在找到有效团队负责人时更新字段 if mapped_lead is not None: result_df.at[index, 'sup_id'] = mapped_lead return result_df
测试与输出
运行以下测试代码:
# 构造示例数据 data = { 'emp_id': [1,2,3,4,5,6,7,8,9,10,11], 'sup_id': ['N/A',1,1,2,2,3,'N/A',7,7,9,19] } df = pd.DataFrame(data) # 执行映射 result_df = map_supervisors_to_project_lead(df) print(result_df)
输出结果:
| emp_id | sup_id |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 1 |
| 7 | 7 |
| 8 | 7 |
| 9 | 7 |
| 10 | 7 |
| 11 | 19 |
关键调整说明
- 统一列名匹配数据集,确保数据读取正常
- 修正递归终止逻辑:团队负责人直接返回自身ID,保证映射结果正确
- 增加上级ID存在性判断,避免无效递归
- 保留未关联员工的原数据,符合需求要求
内容的提问来源于stack exchange,提问作者Kevin Long
相关产品推荐
相关产品推荐

