Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Pandas: conhecendo a biblioteca

Olá! Tudo bem?

Segue abaixo, a resolução dos exercícios:

1)import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/alura-cursos/pandas-conhecendo-a-biblioteca/main/desafios/alunos.csv')
df.isnull().sum()

Saída:

Nome 0
Idade 0
Notas 6
Aprovado 0
dtype: int64

  1. salvando os índices das linhas a serem removidas em uma variável

alunos_a_remover = df.query('Nome == "Alice" | Nome == "Carlos"').index

Saída:

removendo as linhas referentes aos alunos "Alice" e "Carlos"

df.drop(alunos_a_remover, axis=0, inplace=True)

  1. selecao = dados['Aprovado'] == True

df[selecao]

  1. alunos_aprovados = df[selecao]

alunos_aprovados.to_csv('alunos_aprovados.csv', index=False)

Extra:

alunos_aprovados.replace(7.0, 8.0)

alunos_aprovados = alunos_aprovados.replace(7.0, 8.0)
alunos_aprovados

1 resposta

Olá, Nicole. Tudo bem?

Parabéns por concluir mais um desafio prático com o Pandas! O seu código está muito bem estruturado e a lógica para carregar os dados, identificar valores nulos, remover linhas específicas e exportar o resultado final está totalmente correta.

Analisando a sua resolução, notei que ela funciona perfeitamente, mas existem dois pontos de atenção — um pequeno bug de variável na etapa de filtragem e uma boa prática de performance no exercício extra — que vale a pena detalharmos para deixar o seu código impecável e evitar erros na execução.


1. O Bug da Variável dados (Etapa de Seleção)

Na linha onde você cria a sua máscara booleana para filtrar os aprovados, você escreveu:

selecao = dados['Aprovado'] == True

Como você carregou o seu arquivo CSV na variável chamada df lá no início, o Python vai retornar um erro do tipo NameError: name 'dados' is not defined ao chegar nessa linha.

Para que o filtro funcione corretamente com a sua base de dados, basta trocar dados por df:

# Correção da variável para manter a consistência
selecao = df['Aprovado'] == True
alunos_aprovados = df[selecao]

Dica de estilo: No Pandas, quando uma coluna já possui valores do tipo Booleano (True ou False), você não precisa colocar o == True. Você pode passar a coluna direto: selecao = df['Aprovado']. O resultado é exatamente o mesmo e o código fica mais limpo!


2. Entendendo o Comportamento do .replace() (Exercício Extra)

No seu exercício extra, você executou a substituição da nota 7.0 por 8.0 em duas etapas:

alunos_aprovados.replace(7.0, 8.0)
alunos_aprovados = alunos_aprovados.replace(7.0, 8.0)

A primeira linha roda, mas como o Pandas por padrão não altera o DataFrame original (ele gera uma cópia modificada na memória), aquela alteração se perdeu porque não foi salva em lugar nenhum. A segunda linha está perfeita, pois você usou a reatribuição (alunos_aprovados = ...) para gravar o resultado na variável. Portanto, você pode apagar a primeira linha sem medo.

Contudo, há um detalhe conceitual muito importante aqui: da forma como o .replace(7.0, 8.0) foi escrito, o Pandas vai varrer todas as colunas do DataFrame. Se algum aluno tivesse exatamente 7 anos de idade na coluna Idade, a idade dele seria alterada para 8 anos de forma errônea!

Para garantir a segurança dos dados e isolar a alteração apenas na coluna correta, a boa prática é especificar a coluna alvo:

# Substituição segura focada apenas na coluna de Notas
alunos_aprovados['Notas'] = alunos_aprovados['Notas'].replace(7.0, 8.0)

Ajustando o nome da variável dados para df e direcionando o .replace() diretamente para a coluna de notas, o seu script rodará com performance máxima e sem nenhum comportamento inesperado. Excelente trabalho no desafio!

Espero que possa ter lhe ajudado!