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

如何处理嵌套字典并转换为易读的Pandas DataFrame

问题:将嵌套字典转换为带完整字段列的DataFrame

我在做网页表格爬取项目,需要把提取的嵌套字典数据转换成上司易读的格式。

原始数据字典

dicionario = {
    '38609-2023': [
        {'Folio': '6', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '20/03/2023', 'Fecha Trámite': 'Resolución', 'Trámite': 'DESE CUENTA', 'Des. Trámite': '210337-2023', 'Correlativo': 'Cuenta (Secretaria)', 'Salas': 'Bloqueado'},
        {'Folio': '5', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERT. INHABILIDAD ART. 195 C.O.T', 'Des. Trámite': '209274-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'},
        {'Folio': '4', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERT. INHABILIDAD ART. 196 C.O.T', 'Des. Trámite': '209273-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'},
        {'Folio': '2', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERTIFICADO DE INGRESO', 'Des. Trámite': '209272-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'}
    ],
    '38451-2023': [
        {'Folio': '5', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '20/03/2023', 'Fecha Trámite': 'Resolución', 'Trámite': 'DESE CUENTA', 'Des. Trámite': '210447-2023', 'Correlativo': 'Cuenta (Secretaria)', 'Salas': 'Bloqueado'},
        {'Folio': '4', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERT. INHABILIDAD ART. 195 C.O.T', 'Des. Trámite': '208820-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'},
        {'Folio': '2', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERTIFICADO DE INGRESO', 'Des. Trámite': '208819-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'}
    ]
}

已完成的处理步骤

我先按'Año'字段对原始字典分组,生成了新的嵌套字典:

new_dict={}
for keys, values in dicionario.items():
    if not keys in new_dict:
        new_dict[keys]={}
    for value in values:
        try:
            new_dict[keys][value['Año']]
        except KeyError:
            new_dict[keys][value['Año']] = []
        new_dict[keys][value['Año']].append(value)

之后尝试扁平化字典生成DataFrame,但得到的结果是用数字0、1、2作为列名,而不是字典里的'Folio'、'Doc.'等字段名,试过pd.DataFrame.from_dict、pd.json_normalize都没成功,需要解决这个问题。


解决方案

方法1:直接从原始字典生成目标DataFrame(更简洁)

不需要先构建new_dict,可以直接提取所有字典条目,同时保留外层主编号作为索引或列:

import pandas as pd

# 提取所有数据条目,同时记录对应的主编号
data = []
for main_key, items in dicionario.items():
    for item in items:
        item['主编号'] = main_key
        data.append(item)

# 直接生成DataFrame,自动用字典键作为列名
final_df = pd.DataFrame(data)
# 可选:按主编号和Año设置多级索引,提升可读性
final_df = final_df.set_index(['主编号', 'Año'])
print(final_df)

方法2:从已生成的new_dict转换

如果一定要基于已有的new_dict处理,可遍历嵌套结构后生成DataFrame:

import pandas as pd

data = []
for main_key, date_groups in new_dict.items():
    for date, items in date_groups.items():
        for item in items:
            item['主编号'] = main_key
            item['Año'] = date
            data.append(item)

final_df = pd.DataFrame(data)
# 可选:设置多级索引
final_df = final_df.set_index(['主编号', 'Año'])
print(final_df)

方法3:优化你已有的代码流程

针对你之前的扁平化代码,修改最后一步直接展开字典字段:

import pandas as pd

df = pd.DataFrame.from_dict(new_dict, orient="index").stack().to_frame(name='items')
# 对每个列表里的字典展开成DataFrame并合并
final_df = df['items'].apply(pd.DataFrame).reset_index(names=['主编号', 'Año'])
# 展开嵌套结构并设置索引
final_df = final_df.explode('items').apply(pd.Series).set_index(['主编号', 'Año'])
print(final_df)

以上三种方法都能生成以'Folio'、'Doc.'、'Anexo'等字典键作为列名的DataFrame,满足易读性要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:32:13