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

从三层嵌套字典构造Pandas DataFrame:解决数据丢失问题

嵌套字典转结构化DataFrame的问题

我有一个三层嵌套字典,最底层是字典与值的混合结构,想要转换成以最底层键为列名、第一层键为ID的DataFrame。示例字典如下:

my_dict = {
    "id1": {
        "att_1": 1,
        "att_2": {
            "att2_1": "value1",
            "att2_2": "value2"
        }
    },
    "id2": {
        "att_1": 2,
        "att_2": {
            "att2_1": "value3",
            "att2_2": "value4"
        }
    }
}

我尝试用pandas.DataFrame.from_dict()写了这段代码:

import pandas as pd
pd.DataFrame.from_dict({(i): my_dict[i][j] for i in my_dict.keys() for j in my_dict[i].keys()}, orient='index')

但输出结果丢失了第二层的att_1数据,得到的结果是:

att2_1  att2_2
id1  value1  value2
id2  value3  value4

请问怎么修复这个问题,或者有没有更优的实现方式?


解决方法

方法一:修复原代码的扁平化逻辑

你的字典推导式只提取了第二层中是字典的att_2,直接把att_1的值丢弃了。需要先把每个ID对应的所有底层键值对展开成单层字典,再构建DataFrame。

可以写一个简单的扁平化函数处理嵌套结构:

def flatten_dict(d, parent_key='', sep='_'):
    items = []
    for k, v in d.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, dict):
            items.extend(flatten_dict(v, new_key, sep=sep).items())
        else:
            items.append((new_key, v))
    return dict(items)

# 对每个ID对应的字典做扁平化处理
flat_data = {id_val: flatten_dict(data) for id_val, data in my_dict.items()}

# 转成DataFrame
df = pd.DataFrame.from_dict(flat_data, orient='index')

执行后得到的目标结果:

att_1 att2_1 att2_2
id1      1 value1 value2
id2      2 value3 value4

方法二:用pd.json_normalize(更简洁高效)

Pandas内置的json_normalize可以直接处理这种嵌套结构,无需手动写扁平化函数,一步到位:

import pandas as pd

# 把原字典转成包含ID的列表格式
data_list = [{"id": id_val, **data} for id_val, data in my_dict.items()]
# 解析嵌套结构并设置ID为索引
df = pd.json_normalize(data_list).set_index('id')

输出结果和方法一完全一致,代码更简洁,适合处理各种复杂嵌套的字典结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:01:18