Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Normalizando JSON a partir de dados no link

Olá,

Ao invés de baixar o arquivo e importá-lo ao colab, como feito na aula, utilizei o link do github da alura para me referir ao banco de dados JSON que analisamos.

url2 = 'https://raw.githubusercontent.com/alura-cursos/Pandas/main/pacientes_2.json'

dados_pacientes_2 = pd.read_json(url2)
dados_pacientes_2.head()

df_normalizado = pd.json_normalize(dados_pacientes_2['Pacientes'])
df_normalizado

Tudo correu bem dessa forma. No entanto, ao tentar normalizar utilizando o parâmetro 'meta' não houve alteração na base de dados apresentada (ou seja, é como se o meta não funcionasse, as colunas pesquisa e ano continuam não sendo incorporadas à base). Forma utilizada:

df_normalizado2 = pd.json_normalize(dados_pacientes_2['Pacientes'], meta = ['Pesquisa', 'Ano'])
df_normalizado2

Outra forma que tentei foi usando o record_path e dessa vez foi gerado um erro:

df_normalizado2 = pd.json_normalize(dados_pacientes_2, record_path = 'Pacientes', meta = ['Pesquisa', 'Ano'])
df_normalizado2

Resultado --> TypeError: string indices must be integers

Como isso pode ser corrigido usando o link ao invés do arquivo?

2 respostas
solução!

Oi, Laura! tudo bem?

Que bom que você explorou uma abordagem alternativa para carregar os dados! Isso mostra sua iniciativa e disposição para experimentar novas técnicas.

Quando você carrega dados de um link usando pd.read_json, o Pandas trata o URL como uma fonte externa e a leitura é feita para transformar o JSON em um DataFrame. Este processo foca mais em converter formatos de dados do JSON para uma estrutura de DataFrame, e algumas manipulações mais complexas, especialmente com metadados em níveis diferentes da estrutura principal que você está normalizando, podem não ser suportadas diretamente da mesma maneira que seriam com um dicionário.

Como 'Pesquisa' e 'Ano' estão no nível superior e não diretamente dentro de cada objeto em 'Pacientes', você precisa acessar esses metadados de forma ligeiramente diferente. Aqui está uma maneira de fazer isso, aproveitando o fato de que 'Pesquisa' e 'Ano' são constantes para todos os pacientes:

  • Primeiro, normalizamos os dados dos 'Pacientes'.
  • Depois, adicionamos as colunas 'Pesquisa' e 'Ano' manualmente ao DataFrame resultante.
import pandas as pd

url2 = 'https://raw.githubusercontent.com/alura-cursos/Pandas/main/pacientes_2.json'
dados_pacientes_2 = pd.read_json(url2)

# Normalizar apenas os dados dos Pacientes
df_normalizado = pd.json_normalize(dados_pacientes_2['Pacientes'])

# Adicionar as colunas 'Pesquisa' e 'Ano' manualmente
df_normalizado['Pesquisa'] = dados_pacientes_2['Pesquisa']
df_normalizado['Ano'] = dados_pacientes_2['Ano']

df_normalizado.head()

Essa abordagem garante que 'Pesquisa' e 'Ano' sejam adicionados como novas colunas ao DataFrame df_normalizado, já que eles são aplicáveis de forma uniforme a todos os registros. Experimente esse código e veja se ele atende à sua necessidade de incluir essas informações junto aos dados dos pacientes.

Se houver mais alguma coisa que eu possa ajudar, fique à vontade para pedir!

Obrigadaa!