如何将 DataFrame 高效转换为多层嵌套字典

发布时间 - 2026-01-23 00:00:00    点击率:

本文介绍使用 pandas 的链式 `groupby` 与 `apply` 方法,无需显式循环即可将 dataframe 转换为任意深度(如两层)的嵌套字典,显著提升代码简洁性与可读性。

在数据处理中,常需将扁平化的 DataFrame 按多个层级键(如 'col1' → 'col2')组

织为嵌套字典结构,便于后续 JSON 序列化、API 响应构造或配置管理。传统双层 for 循环虽直观,但冗长且不易维护。Pandas 提供了更优雅的向量化方案:嵌套 groupby().apply() 配合 to_dict('records')

核心思路是逐级分组并聚合:

  • 先按第一级键(如 '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自助建站平台?