3
respostas

[Dúvida] Dúvida sobre a função pd.json_normalize()

Bom dia, boa tarde, boa noite. No desafio da aula na qual precisamos importar o arquivo json no site fruityvice, gostaria de tirar a dúvida se não poderia ser feito desta maneira:

import requests

dados_frutas = requests.get('https://fruityvice.com/api/fruit/all')

resultado = json.loads(dados_frutas.text) fruits = pd.DataFrame(resultado)

fruits_normalizados = pd.json_normalize(fruits['nutritions'], meta='name') fruits_normalizados

Da maneira acima ele normaliza corretamente mas não inclui no caso , a coluna 'name do DataFrame fruits, qual seria meu erro?

3 respostas

Olá, Rafael! Tudo bem?

Esse desafio pode ser resolvido com o seguinte código:

import requests
import json

dados_frutas = requests.get('https://fruityvice.com/api/fruit/all')
resultado = json.loads(dados_frutas.text)

import pandas as pd
dados_frutas_normalizado = pd.json_normalize(resultado)
dados_frutas_normalizado

Como os dados não estão aninhados na coluna nutritions, é possível usar diretamente a função json_normalize(), sem a necessidade de especificar a coluna nutritions e o meta='name'.

Caso ainda tenha alguma dúvida não hesite em perguntar!

Bons estudos :)

Tudo certo.

No caso ao usar: fruits_normalizados = pd.json_normalize(fruits['nutritions'])

Estou especificando que na coluna nutritions que precisa ser normalizada, mas além disso gostaria que neste dataframe gerado com o comando acima também estivesse a coluna 'name', semelhante ao outro exemplo nas aulas, em que normalizamos um conjunto de dados e com o parâmetro meta incluímos as demais colunas desejadas.

A minha dúvida é se daria pra fazer isso da maneira acima, sem necessariamente recorrer ao código abaixo:

#Importando a biblioteca Pandas import pandas as pd

#Importando o módulo JSON import json

#Lendo o arquivo json usando o módulo Python JSON with open('../pacientes_2.json','r') as f: dados = json.loads(f.read())

#Normalizando os dados com os parâmetros record_path e meta pd.json_normalize(dados, record_path='Pacientes', meta=['Pesquisa', 'Ano'])

Há como obter o mesmo resultado usando somente o pd.json_normalize()?

Rafael,

Antes de tudo, nós precisamos pensar em como está a estrutura do JSON. Se você tentar carregar o JSON da API das frutas, diretamente sem fazer normalização o resultado será o seguinte:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeNote que temos a coluna "Nutritions" com dados dentro de um dicionário, contendo chaves e valores para cada característica nutricional (calories, fat, sugar...)

Nesse caso, em específico, se usarmos a função json_normalize(), ela vai automaticamente transformar cada uma das chaves e valores em colunas e linhas: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como o nome da coluna original era "nutritions" ela usa essa palavra como um prefixo na criação das novas colunas normalizadas.

Já a normalização com os parâmetros record_path e meta é indicada quando temos estruturas mais complexas em json, como objetos dentro de outros objetos, como listas de dicionários, por exemplo.

No código que você mandou na primeira mensagem, não há necessidade da criação de um DataFrame a partir do resultado da requisição. Como o resultado já é uma lista de dicionários (cada dicionário representa uma fruta), não é necessário criar um DataFrame a partir desses dados.

Então, bastaria o código abaixo para funcionar:

import requests
import json
import pandas as pd

dados_frutas = requests.get('https://fruityvice.com/api/fruit/all')

resultado = json.loads(dados_frutas.text) 
fruits_normalizados = pd.json_normalize(resultado) 
fruits_normalizados

Espero que isso esclareça a abordagem para normalizar esse JSON da API das frutas.

Bons estudos!