Pandas - 规范化 JSON 按名称搜索文件
Pandas - Normalizing JSON File searching by name
美好的一天!
你能帮帮我吗?
使用下面的代码,我得到了这个输出:
import requests
import pandas as pd
import numpy as np
from pandas.io.json import json_normalize
url = 'https://openbanking.api.santander.com.br/open-banking/products-services/v1/personal-financings'
santander = requests.get(url).json()['data']['brand']['companies'][2]['personalFinancings'][4]['interestRates'][0]['applications']#['FINANCIAMENTO_MICROCREDITO']
microcredito = santander
dataframe = json_normalize(microcredito)
dataframe.head()
输出:
我需要得到完全相同的输出,但不是使用下面的数字 4,我需要找到属于 4 的类型的名称,即 "FINANCIAMENTO_MICROCREDITO。我试图直接使用名称、类型和所有内容,但总是出错。请看下面的图片和代码:
santander = requests.get(url).json()['data']['brand']['companies'][2]['personalFinancings']**[4]**['interestRates'][0]['applications']
我需要通过名称查找,因为名称是一个模式,但数字 4 不是,并且代码将是动态的,具有相似的数据。
你能帮帮我吗?
谢谢!
可以使用jmespath来遍历数据;在 personalFinancings
子数据中,您传递过滤器 [?type=='FINANCIAMENTO_MICROCREDITO']
以获取 space.
中的所有数据
总结jmespath:访问一个键,使用.
;要访问列表,请使用 []
。 文档也很详细。
import jmespath
import requests
import pandas as pd
url = 'https://openbanking.api.santander.com.br/open-banking/products-services/v1/personal-financings'
santander = requests.get(url).json()
base_expression = """data
.brand
.companies[2]
.personalFinancings[?type=='FINANCIAMENTO_MICROCREDITO']
.interestRates[]
.applications[]"""
expression = f"""{{ interval: {base_expression}.interval,
index_rate: {base_expression}.indexer.rate,
customer_rate: {base_expression}.customers.rate}}"""
expression = jmespath.compile(expression)
pd.DataFrame(expression.search(santander))
interval indexer_rate customer_rate
0 1_FAIXA 0.0279 0.1080
1 4_FAIXA 0.0399 0.0739
2 2_FAIXA 0.0000 0.0000
3 3_FAIXA 0.0359 0.8181
您也可以只使用普通词典(jmespath
为嵌套 json 数据提供便利)::
from collections import defaultdict
data = defaultdict(list)
for entry in santander['data']['brand']['companies'][2]['personalFinancings']:
for key, value in entry.items():
if key == "type" and value == "FINANCIAMENTO_MICROCREDITO":
for ent in entry['interestRates']:
data['interval'].extend([val['interval']
for val in (ent['applications'])])
data['indexer_rate'].extend([val['indexer']['rate']
for val in (ent['applications'])])
data['customer_rate'].extend([val['customers']['rate']
for val in (ent['applications'])])
pd.DataFrame(data)
interval indexer_rate customer_rate
0 1_FAIXA 0.0279 0.1080
1 4_FAIXA 0.0399 0.0739
2 2_FAIXA 0.0000 0.0000
3 3_FAIXA 0.0359 0.8181
美好的一天!
你能帮帮我吗?
使用下面的代码,我得到了这个输出:
import requests
import pandas as pd
import numpy as np
from pandas.io.json import json_normalize
url = 'https://openbanking.api.santander.com.br/open-banking/products-services/v1/personal-financings'
santander = requests.get(url).json()['data']['brand']['companies'][2]['personalFinancings'][4]['interestRates'][0]['applications']#['FINANCIAMENTO_MICROCREDITO']
microcredito = santander
dataframe = json_normalize(microcredito)
dataframe.head()
输出:
我需要得到完全相同的输出,但不是使用下面的数字 4,我需要找到属于 4 的类型的名称,即 "FINANCIAMENTO_MICROCREDITO。我试图直接使用名称、类型和所有内容,但总是出错。请看下面的图片和代码:
santander = requests.get(url).json()['data']['brand']['companies'][2]['personalFinancings']**[4]**['interestRates'][0]['applications']
我需要通过名称查找,因为名称是一个模式,但数字 4 不是,并且代码将是动态的,具有相似的数据。
你能帮帮我吗?
谢谢!
可以使用jmespath来遍历数据;在 personalFinancings
子数据中,您传递过滤器 [?type=='FINANCIAMENTO_MICROCREDITO']
以获取 space.
总结jmespath:访问一个键,使用.
;要访问列表,请使用 []
。 文档也很详细。
import jmespath
import requests
import pandas as pd
url = 'https://openbanking.api.santander.com.br/open-banking/products-services/v1/personal-financings'
santander = requests.get(url).json()
base_expression = """data
.brand
.companies[2]
.personalFinancings[?type=='FINANCIAMENTO_MICROCREDITO']
.interestRates[]
.applications[]"""
expression = f"""{{ interval: {base_expression}.interval,
index_rate: {base_expression}.indexer.rate,
customer_rate: {base_expression}.customers.rate}}"""
expression = jmespath.compile(expression)
pd.DataFrame(expression.search(santander))
interval indexer_rate customer_rate
0 1_FAIXA 0.0279 0.1080
1 4_FAIXA 0.0399 0.0739
2 2_FAIXA 0.0000 0.0000
3 3_FAIXA 0.0359 0.8181
您也可以只使用普通词典(jmespath
为嵌套 json 数据提供便利)::
from collections import defaultdict
data = defaultdict(list)
for entry in santander['data']['brand']['companies'][2]['personalFinancings']:
for key, value in entry.items():
if key == "type" and value == "FINANCIAMENTO_MICROCREDITO":
for ent in entry['interestRates']:
data['interval'].extend([val['interval']
for val in (ent['applications'])])
data['indexer_rate'].extend([val['indexer']['rate']
for val in (ent['applications'])])
data['customer_rate'].extend([val['customers']['rate']
for val in (ent['applications'])])
pd.DataFrame(data)
interval indexer_rate customer_rate
0 1_FAIXA 0.0279 0.1080
1 4_FAIXA 0.0399 0.0739
2 2_FAIXA 0.0000 0.0000
3 3_FAIXA 0.0359 0.8181