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

10次阅读

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

本文介绍如何将形如 `{block: {text: {key: value}}}` 的三层嵌套字典高效转换为具有多级列索引(multiindex columns)的pandas dataframe,实现结构化表格展示,适用于配置解析、实验结果汇总等场景。

要将深度为三层的嵌套字典(block → text → key)转化为直观、可读性强的表格形式(如 block 为行索引,text 为一级列名,key 为二级列名),核心在于重塑数据结构以匹配 MultiIndex 列布局。直接使用 pd.DataFrame(data) 会因内层字典不统一而生成 Object 类型列,无法满足分层展示需求。

推荐采用“转置 + 展平 + 拼接 + 列索引重建”的四步策略:

  1. 转置原始 DataFrame:df.T 将 block 从键变为行索引,使各 text(如 “text1″、”text2″)成为列名,便于后续按列处理;
  2. 逐列展平内层字典:对每一列(即每个 text),使用 pd.json_normalize() 将其对应的字典(如 {“key1”: “value1”, “key2”: “value2”})展开为独立列;
  3. 水平拼接展平结果:用 pd.concat(…, axis=1) 将各 text 对应的扁平 DataFrame 横向合并;
  4. 构建多级列索引:通过 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=’_’) 配合正则重命名列。

该方法兼顾简洁性与可扩展性,是处理规则化嵌套配置数据的标准实践。

text=ZqhQzanResources