如何用纯Pandas计算企业汇报关系中的层级差距?
纯Pandas实现汇报层级差距(gap)计算
假设某企业的汇报关系由如下Pandas DataFrame定义:
import pandas as pd ref_pd = pd.DataFrame({'employee':['a','b','c','d','e','f'],'supervisor':['c','c','d','f','f',None]})
具体汇报关系:
- a、b向c汇报,c向d汇报,d向f汇报
- e直接向f汇报
- f为最高管理者,无上级
已知企业层级最多为4层(f为第1层,d、e为第2层,c为第3层,a、b为第4层),需要计算如下DataFrame中的gap列:
gap_pd = pd.DataFrame({'supervisor':['d','d','d','d','d','d'],'employee':['a','b','c','d','e','f'],'gap':[2,2,1,0,None,None]})
gap列的计算逻辑(指定管理者为d时):
- 员工为d时,gap为0(无层级差距)
- c直接向d汇报,gap为1
- a、b通过c间接向d汇报,gap为2
- e和f最终不向d汇报,gap为Null
以下是纯Pandas的解决方案,无需依赖图计算库:
实现思路
通过迭代向上追溯每个员工的上级,记录追溯步数:找到目标管理者则返回步数,追溯到最高层仍未找到则返回Null。
代码实现
import pandas as pd # 初始化汇报关系表 ref_pd = pd.DataFrame({'employee':['a','b','c','d','e','f'],'supervisor':['c','c','d','f','f',None]}) # 初始化待计算的gap表(不含gap列) gap_pd = pd.DataFrame({'supervisor':['d','d','d','d','d','d'],'employee':['a','b','c','d','e','f']}) # 定义计算单个员工gap的函数 def calculate_gap(target_supervisor, employee, ref_df): # 员工就是目标管理者,直接返回0 if employee == target_supervisor: return 0 gap = 0 current_emp = employee while True: # 获取当前员工的上级 supervisor = ref_df.loc[ref_df['employee'] == current_emp, 'supervisor'].values[0] # 无上级,说明不在目标汇报链中,返回None if supervisor is None: return None gap += 1 # 找到目标管理者,返回当前步数 if supervisor == target_supervisor: return gap # 继续向上追溯 current_emp = supervisor # 批量计算gap列 gap_pd['gap'] = gap_pd.apply(lambda row: calculate_gap(row['supervisor'], row['employee'], ref_pd), axis=1) # 输出结果 print(gap_pd)
运行结果
supervisor employee gap 0 d a 2.0 1 d b 2.0 2 d c 1.0 3 d d 0.0 4 d e NaN 5 d f NaN
方案说明
- 自定义函数
calculate_gap负责单个员工的层级差距计算,逻辑简单直观 - 使用
apply方法批量处理gap_pd的每一行,适配多目标管理者的场景(如果gap_pd中存在多个不同的supervisor值也能正确计算) - 无需额外依赖,完全基于Pandas的基础操作实现,层级数量超过4层时也能兼容
内容的提问来源于stack exchange,提问作者yurnero
相关产品推荐
相关产品推荐

