如何将嵌套字典列表扁平化为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
相关产品推荐
相关产品推荐

