如何基于DataFrame中经理的level值循环计算员工的level列
问题描述
我有一个用于可视化的DataFrame,需要填充其中的level列,要求员工的level值比其直属经理的level值高1(而非基于grade)。给出的DataFrame示例如下:
name manager grade manager_grade level Michael - 1 - 1 Jim Michael 2 1 2 Dwight Michael 2 1 2 Darryl Michael 3 1 2 Angela Michael 3 1 2 Pam Michael 4 1 2 Roy Darryl 4 3 3 Kevin Angela 4 3 3
我知道需要先按grade对表格排序,再通过for循环迭代计算level。目前我写出的代码如下:
for i in range(len(df)): if df[manager_grade][i] is None: df['level'][i] = df['grade'][i] else: df['level'][i] = df['manager_grade'][i]+ 1
但这段代码仅将manager_grade加1,并未基于经理的level值计算。请问如何修改代码以实现需求?
解决方案
- 先确保数据按层级顺序排序:因为经理的
level必须先被计算出来,才能计算下属的,所以先按grade升序排序(或者按层级关系排序,确保上级在下属前面)。 - 用字典存储已计算的level值:这样可以快速查找经理的level,避免重复查询DataFrame,提升效率。
- 迭代更新level列:遍历每一行,根据经理名称获取对应的level值,再计算当前员工的level。
修改后的代码如下:
import pandas as pd # 先按grade升序排序,确保上级员工在下属之前被处理 df = df.sort_values('grade').reset_index(drop=True) # 创建字典存储员工姓名到对应level的映射 level_map = {} # 先初始化无直属经理的员工level for idx, row in df.iterrows(): if row['manager'] == '-': level_map[row['name']] = 1 df.at[idx, 'level'] = 1 # 遍历剩余员工,基于经理的level计算自身level for idx, row in df.iterrows(): manager_name = row['manager'] if manager_name != '-': # 从字典中获取经理的level,加1作为当前员工的level current_level = level_map[manager_name] + 1 df.at[idx, 'level'] = current_level # 将当前员工的level存入字典,供其下属使用 level_map[row['name']] = current_level
代码说明
- 使用
sort_values保证上级员工先被处理,这样计算下属时,经理的level已经存在于level_map中,不会出现找不到值的情况。 level_map字典实现了快速查询,比反复在DataFrame中检索经理信息更高效。- 如果你的DataFrame中表示无经理的标记不是
'-'而是None,只需将判断条件改为pd.isna(row['manager'])即可适配。
内容的提问来源于stack exchange,提问作者ds_1234
相关产品推荐
相关产品推荐

