将嵌套字典(三层)高效转换为带多级列索引的Pandas表格

7次阅读

将嵌套字典(三层)高效转换为带多级列索引的Pandas表格

本文介绍如何将形如 `{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 参数,但本例结构规整,上述方法更简洁直观。

该方法兼顾可读性与扩展性,是处理固定层级嵌套配置数据的标准实践。

text=ZqhQzanResources