
本文介绍如何将形如 `{block: {text: {key: value}}}` 的三层嵌套字典高效转换为具有多级列索引(multiindex columns)的pandas dataframe,实现结构化表格展示,适用于配置解析、实验结果汇总等场景。
要将深度为三层的嵌套字典(block → text → key)转化为直观、可读性强的表格形式(如 block 为行索引,text 为一级列名,key 为二级列名),核心在于重塑数据结构以匹配 MultiIndex 列布局。直接使用 pd.DataFrame(data) 会因内层字典不统一而生成 object 类型列,无法满足分层展示需求。
推荐采用“转置 + 展平 + 拼接 + 列索引重建”的四步策略:
- 转置原始 DataFrame:df.T 将 block 从键变为行索引,使各 text(如 "text1"、"text2")成为列名,便于后续按列处理;
- 逐列展平内层字典:对每一列(即每个 text),使用 pd.json_normalize() 将其对应的字典(如 {"key1": "value1", "key2": "value2"})展开为独立列;
- 水平拼接展平结果:用 pd.concat(..., axis=1) 将各 text 对应的扁平 DataFrame 横向合并;
- 构建多级列索引:通过 pd.MultiIndex.from_product() 显式定义列层级——第一级为 text 名(原列名),第二级为 key 名(如 "key1", "key2"),确保语义清晰且支持 .xs() 等高级索引操作。
完整代码如下:
import pandas as pd
data = {
"block1": {
"text1": {"key1": "value1", "key2": "value2"},
"text2": {"key1": "value3", "key2": "value4"},
},
"block2": {
"text1": {"key1": "value5", "key2": "value6"},
"text2": {"key1": "value7", "key2": "value8"},
},
}
# 步骤1:构建初始DataFrame并转置
df = pd.DataFrame(data).T
# 步骤2+3:对每列展平并水平拼接
flattened_cols = [pd.json_normalize(df[col]) for col in df.columns]
new_df = pd.concat(flattened_cols, axis=1).set_index(df.index)
# 步骤4:设置多级列索引(text → key)
keys = ["key1", "key2"] # 假设所有text下key结构一致;若不一致,建议先校验
new_df.columns = pd.MultiIndex.from_product([df.columns, keys], names=["text", "key"])
print(new_df)输出效果:
text text1 text2 key key1 key2 key1 key2 block1 value1 value2 value3 value4 block2 value5 value6 value7 value8
✅ 注意事项:
- json_normalize() 要求各 text 下的子字典具有完全一致的键集合;若存在缺失键(如某 text2 缺少 "key2"),需预先填充默认值(如用 pd.json_normalize(df[col], errors='ignore') 或手动补全);
- 列名层级可通过 names=["text", "key"] 显式命名,提升可读性与后续分组操作便利性;
- 若原始嵌套更深(如四层),可递归展平或改用 pd.json_normalize(data, sep='_') 配合正则重命名列。
该方法兼顾简洁性与可扩展性,是处理规则化嵌套配置数据的标准实践。










