python - Pandas:如何规范化具有多个 JSON 嵌套列表的 JSON 文件?
问题描述
我从 API 请求数据,然后尝试规范化这个 JSON 文件,它有这个结构
[{'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'}]
当我应用 JsonNormalize 以将其转换为数据框时,我得到了这个:
ID | 店铺 | 卖 | 产品 | 帕加门托斯 |
---|---|---|---|---|
33 | 1405fdsa6001209 | 110aa346 | [{'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'}] | [{'pagamento_id':'10aa95','valor':'84.9900','numero_parcelas':'10','finalizador_id':'4','finalizador_nome':'Cartao de credito','docs':'500003 ','班德拉':'万事达卡'}] |
如您所见,最后两列没有正确获取值,它们在列表中有字典。我怎样才能解决这个问题?
解决方案
您可以使用pd.json_normalize()
以下各项:
提取主要字段(包括 key
la_id
)提取
products
细节+keyla_id
提取
pagamentos
细节+keyla_id
然后,使用.merge()
common key 合并 3 个结果数据帧la_id
,如下所示:
j_lst = [{'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'}]}]
df_main = pd.json_normalize(j_lst)
df_products = pd.json_normalize(j_lst, record_path=['products'], record_prefix='products.', meta=['la_id'])
df_pagamentos = pd.json_normalize(j_lst, record_path=['pagamentos'], record_prefix='pagamentos.', meta=['la_id'])
df_out = (df_main.merge(df_products, on='la_id')
.merge(df_pagamentos, on='la_id')
.drop(['products', 'pagamentos'], axis=1)
)
结果:
print(df_out)
la_id store sell payment.paymentid payment.value payment.number payment.finalid payment.finalname payment.docs payment.flag products.codigo products.lacre products.valor pagamentos.pagamento_id pagamentos.valor pagamentos.numero_parcelas pagamentos.finalizador_id pagamentos.finalizador_nome pagamentos.documento pagamentos.bandeira
0 33 1405fdsa6001209 110aa346 10a836 259.6000 4 4 Cartao de credito 849763 None 176690 15980fd2293 49.90 107795 854.9900 10 4 Cartao de credito 500003 MASTERCARD
1 33 1405fdsa6001209 110aa346 10a836 259.6000 4 4 Cartao de credito 849763 None sd4907 1598a12385 19.90 107795 854.9900 10 4 Cartao de credito 500003 MASTERCARD
2 33 1405fdsa6001209 110aa346 10a836 259.6000 4 4 Cartao de credito 849763 None aa4907 1598a2384 19.90 107795 854.9900 10 4 Cartao de credito 500003 MASTERCARD
3 33 1405fdsa6001209 110aa346 10a836 259.6000 4 4 Cartao de credito 849763 None 1fd307 1598a20401 169.90 107795 854.9900 10 4 Cartao de credito 500003 MASTERCARD
推荐阅读
- java - Spring Security OAuth2使用密码Grant登录
- dns - 无法让我的域正常工作。我该怎么办?
- xml - 登录后自动发布内容
- ruby-on-rails - 如何按名称对@users.person.name 进行排序?(Ruby on Rails)
- java - 如何打印找到的设备的名称?
- java - 从其他实体检索ID时的Spring Boot JPA反序列化问题
- ios - 如何创建任意数量的不同级别,而不必为每个 SKS 级别创建重复代码?精灵包
- python-3.x - 将列表传递给 Jupyter 中的 ScraPy Spider
- javascript - 删除所有选项卡的选项卡关闭时的 sessionStorage 属性
- r - 二元运算符的非数字参数 - log()