
本文介绍如何将形如 `{block: {text: {key: value}}}` 的三层嵌套字典,转化为具有多级列索引(block → text → key)的结构化pandas dataframe,并支持直观打印与后续分析。
在数据分析中,常需将深层嵌套的配置型或分组型字典结构“展平”为二维表格以便可视化、筛选或导出。上述 data 是典型的三层嵌套:最外层为 block(如 "block1"),中间层为 text(如 "text1"),最内层为 key-value 对(如 "key1": "value1")。目标是构建一个行索引为 block、列索引为 (text, key) 的 MultiIndex DataFrame。
核心思路是:先转置原始 DataFrame 使 blocks 成为行索引,再对每个 text 字典单独标准化(json_normalize),最后横向拼接并构造多级列名。具体实现如下:
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"},
},
}
# Step 1: 构建初始 DataFrame(列=blocks,行=texts)
df = pd.DataFrame(data)
# Step 2: 转置 → 行=blocks,列=texts(此时每列为一个 dict)
df_t = df.T
# Step 3: 对每个 text 列应用 json_normalize,展开为扁平列(key1, key2),再水平拼接
normalized_parts = [pd.json_normalize(df_t[col]) for col in df_t.columns]
combined = pd.concat(normalized_parts, axis=1, keys=df_t.columns)
# Step 4: 设置行索引为 block 名(即原 df_t.index)
combined.index = df_t.index
# 最终结果
print(combined)输出效果:
text1 text2
key1 key2 key1 key2
block1 value1 value2 value3 value4
block2 value5 value6 value7 value8✅ 注意事项与优化建议:
- json_normalize 要求输入为 list 或 dict;此处 df_t[col] 是 Series,但 pd.json_normalize() 可直接处理含字典的 Series,自动按行展开。
- 若内层键名不统一(如某些 text1 缺少 "key2"),json_normalize 会自动填充 NaN,保证列对齐。
- 如需导出为 Excel 并保留多级表头,使用 to_excel() 即可原生支持;若需渲染为 Markdown 表格,可调用 to_markdown(multiindex=True)。
- 替代方案(更通用):使用 pd.json_normalize(data, max_level=2) 配合 record_path 和 meta 参数,但本例结构规整,上述方法更简洁直观。
该方法兼顾可读性与扩展性,是处理固定层级嵌套配置数据的标准实践。










