Pandas如何规范化包含多层嵌套JSON列表的JSON文件
解决方案
问题根因
pandas.json_normalize默认仅展开JSON结构中的对象层级,不会自动解析列表类型的嵌套字段,因此你直接调用时products、pagamentos两个列表字段会保持原有的嵌套格式。
实现代码
场景1:单独展开单个列表字段
以展开products字段为例,显式指定record_path标记要展开的列表,用meta指定需要保留的上层公共字段:
import pandas as pd # 你的原始API返回JSON数据 raw_data = [{'la_id': '33', 'store': '1405fdsa6001209', 'sell': '110aa346', 'products': [{'codigo': '176690', 'lacre': '15980fd2293', 'valor': '49.90'}, {'codigo': 'sd4907', 'lacre': '1598a12385', 'valor': '19.90'}, {'codigo': 'aa4907', 'lacre': '1598a2384', 'valor': '19.90'}, {'codigo': '1fd307', 'lacre': '1598a20401', 'valor': '169.90'}], 'payment': {'paymentid': '10a836', 'value': '259.6000', 'number': '4', 'finalid': '4', 'finalname': 'Cartao de credito', 'docs': '849763', 'flag': None}, 'pagamentos': [{'pagamento_id': '107795', 'valor': '854.9900', 'numero_parcelas': '10', 'finalizador_id': '4', 'finalizador_nome': 'Cartao de credito', 'documento': '500003', 'bandeira': 'MASTERCARD'}] }] # 展开products列表,保留上层公共字段 df_products = pd.json_normalize( raw_data, record_path='products', meta=[ # 一级上层字段 'la_id', 'store', 'sell', # 嵌套payment对象的字段,用列表指定层级 ['payment', 'paymentid'], ['payment', 'value'], ['payment', 'finalname'] ], # 可选:给展开的字段加前缀避免重名 record_prefix='product_' )
如果要展开pagamentos字段,只需把record_path的值替换为pagamentos即可。
场景2:同时展开两个列表字段到同一张表
json_normalize单次仅支持指定一个待展开的列表,因此可以分别展开两个列表后通过公共字段关联合并:
# 先分别展开两个列表字段 df_products = pd.json_normalize( raw_data, record_path='products', meta=['la_id', 'sell'], record_prefix='product_' ) df_pagamentos = pd.json_normalize( raw_data, record_path='pagamentos', meta=['la_id', 'sell'], record_prefix='pagamento_' ) # 通过公共的订单标识字段关联合并 df_full = pd.merge(df_products, df_pagamentos, on=['la_id', 'sell'], how='left')
内容的提问来源于stack exchange,提问作者Leonardo Amador
相关产品推荐
相关产品推荐

