You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将嵌套字典列表扁平化为Pandas DataFrame?

问题描述

现有由嵌套字典和列表组成的数据结构:

my_list = [
    {'a1':'1','b1':[{'c11':'2','d11':'3','e11':'4','f11':'5'},{'c12':'6','d12':'7','e12':'8','f12':'9'}],'g1':'10','h1':'11'},
    {'a2':'12','b2':[{'c21':'13','d21':'14','e21':'15','f21':'16'},{'c22':'17','d22':'18','e22':'19','f22':'20'}],'g2':'21','h2':'22'},
    # 更多同结构元素
]

需要将其扁平化为如下结构的Pandas DataFrame:

a1  c11  d11  e11  f11  c12  d12  e12  f12  g1  h1
0   1    2    3    4    5    6    7    8    9  10  11
1  12   13   14   15   16   17   18   19   20  21  22

尝试过json_normalize及相关示例但未成功,该如何实现转换?

解决方案

直接用json_normalize失败的核心原因是每个字典的键名不统一(比如a1/a2、b1/b2),无法自动对齐列名。可以通过以下步骤处理:

步骤1:编写扁平化函数

遍历每个元素,展开嵌套列表,并统一列名(去除键名后的数字后缀):

import pandas as pd

def flatten_dict(item):
    flat = {}
    for k, v in item.items():
        if isinstance(v, list):
            # 展开嵌套列表里的所有子字典,保留原始键名
            for sub in v:
                flat.update(sub)
        else:
            # 统一列名:去掉键名中的数字,比如a2→a1,g2→g1
            clean_key = ''.join([char for char in k if not char.isdigit()])
            flat[clean_key] = v
    return flat

步骤2:处理所有数据并转DataFrame

# 对列表中每个元素做扁平化处理
flattened = [flatten_dict(i) for i in my_list]

# 转为DataFrame并调整列顺序匹配目标结构
df = pd.DataFrame(flattened)
target_columns = ['a1', 'c11', 'd11', 'e11', 'f11', 'c12', 'd12', 'e12', 'f12', 'g1', 'h1']
df = df[target_columns]

# 查看结果
print(df)

关键说明

  • 针对嵌套列表(b1/b2这类键):直接将列表内的子字典键值对合并到扁平字典中,保留子字典的原始键名(如c11、c12);
  • 针对普通键(a1/a2、g1/g2):通过去除键名中的数字后缀,让不同元素的同类型数据对应同一列名;
  • 如果你的键名规律不是数字后缀,只需修改clean_key的生成逻辑即可适配。

内容的提问来源于stack exchange,提问作者Srinivas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:25:18