如何将一对多关联的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
相关产品推荐
相关产品推荐

