You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将一对多关联的Pandas DataFrame转换为层级JSON

优雅实现Pandas DataFrame转层级JSON的方法

你提到的这种需求其实很常见——要把关联的部门和员工数据转成层级化的JSON,不用先合并再分组(确实那样容易混淆列归属),这里有几个简洁又直观的实现方式:

方法一:groupby+apply构造嵌套结构

我们可以直接从员工表出发,按部门ID分组生成员工的字典列表,再和部门表关联后整理成目标格式:

import pandas as pd

# 你的原始数据
dept = pd.DataFrame({'dep_id': [1,2], 'dep_name':['shoes', 'giraffes']})
emp = pd.DataFrame({'dep_id': [1,1,2], 'emp_name': ['joe', 'bo', 'gigi']})

# 按部门ID分组,把每个部门的员工转成字典列表
emp_groups = emp.groupby('dep_id')['emp_name'].apply(
    lambda x: [{'emp_name': name} for name in x]
).reset_index(name='emps')

# 和部门表关联,保留需要的字段后转成JSON
result = pd.merge(dept, emp_groups, on='dep_id')[['dep_name', 'emps']].to_json(orient='records', indent=2)

print(result)

运行后就能得到你想要的层级JSON:

[
  { "dep_name": "shoes", "emps": [{"emp_name": "joe"}, {"emp_name": "bo"}]},
  { "dep_name": "giraffes", "emps": [{"emp_name": "gigi"}]}
]

方法二:更紧凑的链式写法

如果喜欢简洁的代码风格,可以把步骤合并成链式操作:

result = (
    dept.merge(
        emp.groupby('dep_id')['emp_name']
           .apply(lambda s: s.to_frame().to_dict('records'))
           .reset_index(name='emps'),
        on='dep_id'
    )[['dep_name', 'emps']]
    .to_json(orient='records', indent=2)
)

这里用s.to_frame().to_dict('records')替代了手动生成字典列表,逻辑和方法一完全一致,只是写法更紧凑。

为什么这种方式更优雅?

  • 不需要先做全量合并:避免了部门数据重复,直接从分组入手,天然区分了部门层和员工层的字段
  • 利用Pandas原生能力,代码可读性强,也容易扩展(比如后续要加更多员工字段,只需要调整groupby后的apply部分)

内容的提问来源于stack exchange,提问作者ihadanny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:54:49