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

[Projeto] Desafio: bora praticar?

# Importando novamente os dados
import pandas as pd

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

Desafio 1
Verifique se a base de dados possui dados nulos e caso tenha, realize o tratamento desses dados nulos

dados_alunos.isnull().sum()
dados_alunos.fillna(0, inplace=True)
dados_alunos.isnull().sum()

Desafio 2
Os alunos "Alice" e "Carlos", não fazem mais parte da turma. Sendo assim, remova-os da base de dados

alunos_a_remover = dados_alunos.query('Nome == "Alice" or Nome == "Carlos"').index
alunos_a_remover
dados_alunos.drop(alunos_a_remover, inplace=True, axis=0)
alunos_a_remover = dados_alunos.query('Nome == "Alice" or Nome == "Carlos"').index
alunos_a_remover

Desafio 3
Aplique um filtro que selecione apenas os alunos que foram aprovados

dados_alunos
df_aprovados = dados_alunos.query('Aprovado == True')
df_aprovados

Desafio 4
Salve o DataFrame que possui apenas os alunos aprovados em um arquivo csv chamado "alunos_aprovados.csv"

df_aprovados.to_csv('alunos_aprovados.csv', index=False)
pd.read_csv('alunos_aprovados.csv')

Extra
Ao conferir as notas dos alunos aprovados, notamos que algumas notas estavam incorretas. As alunas que tiraram nota 7.0, na verdade tinham um ponto extra que não foi contabilizado. Sendo assim, substitua as notas 7.0 da base de dados por 8.0. Dica: pesquise pelo método replace

df_aprovados.replace(7.0, 8.0, inplace=True)
df_aprovados
df_aprovados.to_csv('alunos_aprovados_corrigido.csv', index=False)
verificando_alunos_corrigidos= pd.read_csv('alunos_aprovados_corrigido.csv')
2 respostas
solução!

Olá, Marcelo! Como vai?

Que resolução sensacional! O seu código está extremamente limpo, bem documentado e direto ao ponto. Você resolveu todos os desafios propostos aplicando as melhores práticas de manipulação com a biblioteca Pandas.

O uso de métodos como .query(), .fillna() com modificação em memória (inplace=True) e a correta exportação de arquivos omitindo os índices automáticos provam que você dominou os conceitos do capítulo de tratamento de dados.

Vamos destacar alguns pontos muito fortes da sua solução e dar um pequeno detalhe técnico sobre o desafio extra que vale a pena ficar no radar.


Análise Espetacular dos Desafios

Desafio 1 e 2: Tratamento de Nulos e Remoção por Índice

A sua abordagem para remover os alunos "Alice" e "Carlos" foi excelente. Em vez de tentar filtrar o texto diretamente no .drop(), você usou a elegância do .query() para localizar as linhas, capturou o .index delas e aí sim aplicou o corte no eixo horizontal (axis=0). Isso é muito eficiente!

Desafio 3 e 4: Filtros e Exportação Profissional

Como comentamos no seu post anterior, o uso do index=False no método .to_csv() foi cirúrgico. Ele impede que uma coluna de ID inútil seja criada ao ler o arquivo novamente, mantendo a estrutura do dataset de aprovação limpa e enxuta.


Um Ponto de Atenção Importante: O Desafio Extra e o SettingWithCopyWarning

O seu uso do método .replace(7.0, 8.0, inplace=True) resolveu o problema perfeitamente e o resultado na tela ficou correto. No entanto, dependendo da versão do Pandas que você estiver utilizando no seu ambiente de desenvolvimento, essa linha pode disparar um aviso cinza no terminal chamado SettingWithCopyWarning.

Por que isso acontece?
Quando você criou o DataFrame de aprovados usando df_aprovados = dados_alunos.query('Aprovado == True'), o Pandas não cria uma tabela totalmente nova na memória. Por questão de performance, ele cria apenas uma "visão" (ou uma referência) que aponta de volta para os dados originais da tabela dados_alunos.

Quando você roda um .replace(..., inplace=True) em cima de df_aprovados, o Pandas fica confuso sem saber se você quer alterar apenas os dados do filtro ou se ele deve ir lá na tabela original (dados_alunos) e alterar as notas das alunas originais também.

Como deixar o seu código 100% blindado contra esse aviso?

A melhor prática de mercado para evitar qualquer comportamento inesperado ao manipular fatias de dados é isolar o DataFrame filtrado usando o método .copy().

Veja como ficaria o ajuste no seu Desafio 3:

# O .copy() força o Pandas a criar um objeto totalmente novo e independente na memória
df_aprovados = dados_alunos.query('Aprovado == True').copy()
df_aprovados

A partir do momento em que você coloca o .copy(), o df_aprovados vira uma tabela independente. Você pode usar .replace(), .fillna() ou qualquer operação destrutiva sem o risco de afetar os dados originais e sem gerar nenhum alerta no console!

Parabéns pela dedicação e pelo volume gigante de desafios concluídos com sucesso, Marcelo. Seu nível de domínio em Pandas está excelente!

Espero que possa ter lhe ajudado!

Olá Evandro, vou bem e você?

A sensacional, essa dica do copy(), eu estava na dúvida se jogava num novo dataframe, mas fiquei pensando , vou ocupar recurso a toa aqui, mas pensando bem é uma boa pratica mesmo em outros projetos um acidente de percurso e uma operação destrutiva pode ter que começar tudo de novo.
Obrigado, abs.