
本文介绍如何将形如 `{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 参数,但本例结构规整,上述方法更简洁直观。
该方法兼顾可读性与扩展性,是处理固定层级嵌套配置数据的标准实践。