如何将 DataFrame 高效转换为多层嵌套字典
发布时间 - 2026-01-23 00:00:00 点击率:次本文介绍使用 pandas 的链式 `groupby` 与 `apply` 方法,无需显式循环即可将 dataframe 转换为任意深度(如两层)的嵌套字典,显著提升代码简洁性与可读性。
在数据处理中,常需将扁平化的 DataFrame 按多个层级键(如 'col1' → 'col2')组

核心思路是逐级分组并聚合:
- 先按第一级键(如 'col1')分组;
- 对每个子组再按第二级键(如 'col2')分组;
- 将最内层子组直接转为记录列表(to_dict('records'));
- 最终调用 .to_dict('index') 将外层 Series 转为字典。
以下是完整实现:
import pandas as pd
from pprint import pprint
# 构造示例数据
a = pd.DataFrame([
{'col1': 'A', 'col2': 'Person 1', 'height': 1, 'weight': 10},
{'col1': 'A', 'col2': 'Person 1', 'height': 2, 'weight': 20},
{'col1': 'A', 'col2': 'Person 1', 'height': 3, 'weight': 30},
{'col1': 'A', 'col2': 'Person 2', 'height': 4, 'weight': 40},
{'col1': 'A', 'col2': 'Person 2', 'height': 5, 'weight': 50},
{'col1': 'A', 'col2': 'Person 2', 'height': 6, 'weight': 60},
{'col1': 'B', 'col2': 'Person 1', 'height': 11, 'weight': 101},
{'col1': 'B', 'col2': 'Person 1', 'height': 21, 'weight': 201},
{'col1': 'B', 'col2': 'Person 1', 'height': 31, 'weight': 301},
{'col1': 'B', 'col2': 'Person 2', 'height': 41, 'weight': 401},
{'col1': 'B', 'col2': 'Person 2', 'height': 51, 'weight': 501},
{'col1': 'B', 'col2': 'Person 2', 'height': 61, 'weight': 601},
])
# ✅ 推荐:单行嵌套 groupby 实现两层嵌套字典
out = a.groupby('col1').apply(
lambda x: x.groupby('col2').apply(lambda y: y.to_dict('records'))
).to_dict('index')
pprint(out)该方法可轻松扩展至 三层及以上嵌套(例如再增加 'col3'):
# 三层示例(伪代码,需确保 col3 存在)
out_3level = a.groupby('col1').apply(
lambda x: x.groupby('col2').apply(
lambda y: y.groupby('col3').apply(lambda z: z.to_dict('records'))
)
).to_dict('index')⚠️ 注意事项:
- to_dict('index') 是关键——它将 groupby().apply() 返回的 Series(索引为 'col1' 值)转为字典;若省略,结果仍是 Series 对象。
- 内层 apply(lambda y: y.to_dict('records')) 返回的是 Series(索引为 'col2'),外层 .to_dict('index') 自动将其展开为第二层键值对。
- 性能上,此方法仍基于 Pandas 分组引擎,比纯 Python 循环更高效,尤其在中等规模数据(万行级)下优势明显。
- 若需排除分组列(如 'col1', 'col2')以精简输出字典字段,可在 to_dict('records') 前使用 drop(columns=['col1','col2'])。
总结:利用 groupby().apply() 的函数式嵌套能力,可完全替代手动循环,写出清晰、可读、可扩展的多级嵌套字典构建逻辑,是 Pandas 高级数据重塑的典型实践。
# python
# js
# json
# app
# 键值对
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
C语言设计一个闪闪的圣诞树
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
实例解析Array和String方法
Laravel Fortify是什么,和Jetstream有什么关系
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
BootStrap整体框架之基础布局组件
如何挑选最适合建站的高性能VPS主机?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
Python图片处理进阶教程_Pillow滤镜与图像增强
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
香港服务器建站指南:免备案优势与SEO优化技巧全解析
如何快速生成专业多端适配建站电话?
如何解决hover在ie6中的兼容性问题
如何在宝塔面板中修改默认建站目录?
nginx修改上传文件大小限制的方法
青岛网站建设如何选择本地服务器?
js实现点击每个li节点,都弹出其文本值及修改
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Internet Explorer官网直接进入 IE浏览器在线体验版网址
微信小程序 require机制详解及实例代码
Laravel怎么在Blade中安全地输出原始HTML内容
linux写shell需要注意的问题(必看)
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
如何在腾讯云服务器上快速搭建个人网站?
Android实现代码画虚线边框背景效果
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何快速搭建高效服务器建站系统?
昵图网官网入口 昵图网素材平台官方入口
Python数据仓库与ETL构建实战_Airflow调度流程详解
如何快速搭建自助建站会员专属系统?
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
JS碰撞运动实现方法详解
零基础网站服务器架设实战:轻量应用与域名解析配置指南
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
JS实现鼠标移上去显示图片或微信二维码
公司网站制作价格怎么算,公司办个官网需要多少钱?
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
Python文件操作最佳实践_稳定性说明【指导】
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Laravel如何生成URL和重定向?(路由助手函数)
敲碗10年!Mac系列传将迎来「触控与联网」双革新
原生JS获取元素集合的子元素宽度实例
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何快速登录WAP自助建站平台?

