2
respostas

Dataframe imutável?

Baixei esse arquivo do Kaggle https://www.kaggle.com/datasets/rounakbanik/the-movies-dataset. O Arquivo é "movies_metadata.csv". Mas estou tentando usar o explode e o normalize e não está funcionando. Alguém poderia me ajudar porque não está funcionando?

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá, Jean, tudo bem?

Apesar de genres e belongs_to_collection parecerem conter listas ou dicionários, na verdade elas são strings (texto) no DataFrame. Isso pode ocorrer porque o pandas não converte automaticamente JSON serializado em objetos Python. Por exemplo: "[{'id': 16, 'name': 'Animation'}, {'id': 35, 'name': 'Comedy'}]". O pandas interpreta isso como uma string, e não como uma lista de dicionários.

Como genres não é uma lista de objetos Python, mas sim uma string, o método explode não consegue separar os elementos. Outra questão é que a função pd.json_normalize funciona apenas com dados no formato de dicionários. Se a coluna contém valores NaN ou strings não desserializadas, o resultado será vazio.

Para solucionar, primeiro, você terá que transformar as colunas que contêm listas ou dicionários em objetos Python utilizáveis, neste caso, você pode converter usando ast.literal_eval . Depois, aplique o explode ou pd.json_normalize.

Uma sugestão de código é:

import pandas as pd
import ast

# Carregar o dataset
df = pd.read_csv('movies_metadata.csv')

# Desserializar a coluna 'genres' de string para lista de dicionários
df['genres'] = df['genres'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else x)

# Explodir a coluna 'genres' (uma linha para cada gênero)
exploded_genres = df.explode('genres')

# Normalizar os dicionários na coluna 'genres'
normalized_genres = pd.json_normalize(exploded_genres['genres'])

# Combinar os gêneros normalizados com o DataFrame original
df_with_genres = pd.concat([exploded_genres.reset_index(drop=True), normalized_genres], axis=1)

# Resultado
df_with_genres.head()

Espero ter ajudado.

Qualquer dúvida, não hesite em compartilhar no fórum.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado