
本文介绍使用 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 高级数据重塑的典型实践。










