本文介绍使用 pandas 的链式 `groupby` 与 `apply` 方法,无需显式循环即可将 dataframe 转换为任意深度(如两层)的嵌套字典,显著提升代码简洁性与可读性。
在数据处理中,常需将扁平化的 DataFrame 按多个层级键(如 'col1' → 'col2')组织为嵌套字典结构,便于后续 JSON 序列化、API 响应构造或配置管理。传统双层 for 循环虽直观,但冗长且不易维护。Pandas 提供了更优雅的向量化方案:嵌套 groupby().apply() 配合 to_dict('records')。
核心思路是逐级分组并聚合:
以下是完整实现:
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')⚠️ 注意事项:
总结:利用 groupby().apply() 的函数式嵌套能力,可完全替代手动循环,写出清晰、可读、可扩展的多级嵌套字典构建逻辑,是 Pandas 高级数据重塑的典型实践。