如何将含员工上下级层级的Pandas DataFrame转为多层嵌套树形JSON
解决方案
你需要通过自定义遍历逻辑构建嵌套树结构,再转换为JSON,无需依赖Pandas原生JSON转换能力,示例代码如下:
import pandas as pd import json # 假设df为你补充上级经理信息后的DataFrame,先处理空的上级ID df = df.fillna({"MANAGER_EMPLOYEE_ID": ""}) # 1. 初始化所有员工的节点映射表,key为员工ID,value为目标结构的节点对象 emp_node_map = {} for _, row in df.iterrows(): emp_id = row["EMPLOYEE_ID"] emp_node_map[emp_id] = { "employeeID": emp_id, "name": row["NAME"], "reportees": [] } # 2. 遍历所有员工,挂载到对应上级的汇报列表中 root_nodes = [] for _, row in df.iterrows(): emp_id = row["EMPLOYEE_ID"] manager_id = row["MANAGER_EMPLOYEE_ID"] # 无上级的节点为根节点(最高层管理者) if not manager_id or pd.isna(manager_id): root_nodes.append(emp_node_map[emp_id]) continue # 有上级的节点加入上级的汇报列表 if manager_id in emp_node_map: emp_node_map[manager_id]["reportees"].append(emp_node_map[emp_id]) # 3. 转换为JSON,单根节点取列表第一个元素,多根节点直接转换列表 target_json = json.dumps( root_nodes[0] if len(root_nodes) == 1 else root_nodes, ensure_ascii=False, indent=2 ) print(target_json)
以你补充后的DataFrame运行上述代码,输出结果如下:
{ "employeeID": "40", "name": "G", "reportees": [ { "employeeID": "42", "name": "S", "reportees": [ { "employeeID": "0c", "name": "H", "reportees": [] } ] }, { "employeeID": "T", "name": "M", "reportees": [] } ] }
相关概念解释
你看到的「目标数据结构是递归的而非表格型的」表述,含义如下:
- Pandas核心能力是处理二维表格数据,所有记录为平级关系,每行代表一条独立记录,分组、索引等操作都基于平级维度,无法原生支持深度不固定的嵌套结构
- 你需要的树形结构属于递归结构:每个子节点和父节点的结构完全一致,嵌套层数没有固定上限(可能是2层、也可能是10层),Pandas原生方法只能处理固定层级的聚合,无法自动适配任意深度的嵌套关系,因此需要自定义逻辑完成层级构建。
内容的提问来源于stack exchange,提问作者Astrian_72954
相关产品推荐
相关产品推荐

