如何处理嵌套字典并转换为易读的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
相关产品推荐
相关产品推荐

