基于Pandas DataFrame实现员工父子关系层级结构填充
用递归遍历Pandas DataFrame生成员工完整层级路径
给定一个记录员工直属上下级关系的Pandas DataFrame,其中Child是员工ID,Parent是其直属上级ID:
import pandas as pd data = pd.DataFrame({'Parent':['a','a','b','c','c','f','q','z','k'], 'Child':['b','c','d','f','g','h','k','q','w']})
对应的层级树形结构如下:
a ├── b │ └── d └── c ├── f │ └── h └── g z └── q └── k └── w
需要生成一个新的DataFrame,展示每个员工的完整层级路径,格式示例如下:
| child | level1 | level2 | level3 |
|---|---|---|---|
| a | a | - | - |
| b | a | - | - |
| d | a | b | - |
| c | a | - | - |
| f | a | c | - |
| h | a | c | f |
| g | a | c | - |
| z | z | - | - |
| q | z | - | - |
| k | z | q | - |
| w | z | q | k |
由于层级数量不固定,以下是基于递归遍历的实现方案:
实现思路
- 定位根节点:找出所有未出现在
Child列中的Parent(这类员工无上级),同时将根节点纳入员工列表(原数据中根节点仅作为上级存在,无对应员工行)。 - 递归追溯路径:编写递归函数,对每个员工向上遍历所有上级,生成从根节点到当前员工的完整路径。
- 整理格式:将所有员工的路径转换为DataFrame,统一层级列名,用
'-'填充缺失层级。
代码实现
import pandas as pd def get_hierarchy_path(child_id, parent_map): """递归获取员工的完整层级路径(从根节点到当前员工)""" # 当前员工是根节点,直接返回自身 if child_id not in parent_map: return [child_id] # 递归获取上级路径,再拼接自身 parent_id = parent_map[child_id] return get_hierarchy_path(parent_id, parent_map) + [child_id] # 1. 构建「员工ID→直属上级ID」的映射字典 parent_child_map = data.set_index('Child')['Parent'].to_dict() # 2. 收集所有员工:原数据的员工 + 根节点 all_employees = set(data['Child']).union(set(data['Parent'])) # 3. 为每个员工生成层级数据 hierarchy_rows = [] for emp in all_employees: full_path = get_hierarchy_path(emp, parent_child_map) row = {'child': emp} # 提取路径中除自身外的所有节点,作为层级列 for idx, level_node in enumerate(full_path[:-1], start=1): row[f'level{idx}'] = level_node hierarchy_rows.append(row) # 4. 转换为DataFrame并填充缺失值 result_df = pd.DataFrame(hierarchy_rows).fillna('-') # 按员工ID排序(可选,匹配示例顺序) result_df = result_df.sort_values('child').reset_index(drop=True) print(result_df)
代码说明
get_hierarchy_path:递归向上遍历,直到根节点,返回完整路径列表(根节点在前,当前员工在后)。parent_child_map:通过字典实现O(1)时间复杂度的上下级查询,提升遍历效率。- 层级列生成:路径中除当前员工外的所有节点,依次对应
level1(最高级)到levelN(直接上级)。 - 缺失值填充:用
'-'统一填充无对应层级的位置,保证输出格式一致。
内容的提问来源于stack exchange,提问作者Tiago
相关产品推荐
相关产品推荐

