Solucionado (ver solução)

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!

Solucionado
(ver solução)
1
resposta

[Projeto] Desafio: bora praticar? | Pandas: conhecendo a biblioteca

Objetivos do Desafio

  1. Verificar e tratar dados nulos - Identificar valores NaN e decidir como tratá-los
  2. Remover registros específicos - Eliminar linhas de Alice e Carlos
  3. Filtrar alunos aprovados - Manter apenas quem tem nota >= 7.0
  4. Salvar resultado - Exportar para CSV
  5. Ajustar notas - Substituir 7.0 por 8.0 usando replace()

PASSO 1: VERIFICAR DADOS NULOS

Identificar dados nulos

# Ver quantos valores nulos existem em cada coluna
print(df.isnull().sum())

# Ver percentual de dados nulos
percentual = (df.isnull().sum() / len(df) * 100)
print(percentual)

# Ver todas as linhas com valores nulos
print(df[df.isnull().any(axis=1)])

Estratégias de tratamento

Opção 1: Remover linhas com nulos (mais comum)

df = df.dropna()

Opção 2: Preencher com valor específico

df['Notas'].fillna(0)  # Preencher com 0
df['Notas'].fillna(df['Notas'].mean())  # Preencher com a média

Opção 3: Remover apenas colunas específicas

df = df.dropna(subset=['Notas'])  # Remove se Notas for nulo

PASSO 2: REMOVER ALUNOS ESPECÍFICOS

Método 1: Usando isin() com ~ (negação)

# Remover Alice e Carlos
df = df[~df['Aluno'].isin(['Alice', 'Carlos'])]

Como funciona:

  • isin(['Alice', 'Carlos']) → Retorna True para Alice e Carlos
  • ~ (til) → Inverte o resultado (True vira False, False vira True)
  • Resultado: Mantém apenas quem NÃO é Alice nem Carlos

Método 2: Usando drop() com índices

# Se souber os índices das linhas
df = df.drop([0, 2])  # Remove linhas 0 e 2

Método 3: Usando query()

df = df.query("Aluno not in ['Alice', 'Carlos']")

PASSO 3: FILTRAR ALUNOS APROVADOS

Filtragem simples

# Manter apenas quem tem nota >= 7.0
df_aprovados = df[df['Notas'] >= 7.0].copy()

Por que usar .copy()?

  • Evita avisos do pandas sobre SettingWithCopyWarning
  • Garante que você está trabalhando com uma cópia, não uma visualização

Filtragem com múltiplas condições

# Aprovados E com frequência > 80%
df_aprovados = df[(df['Notas'] >= 7.0) & (df['Frequência'] > 0.8)]

# Aprovados OU com frequência > 90%
df_aprovados = df[(df['Notas'] >= 7.0) | (df['Frequência'] > 0.9)]

PASSO 4: SALVAR EM ARQUIVO CSV

# Salvar sem índice
df_aprovados.to_csv('alunos_aprovados.csv', index=False)

# Com opções adicionais
df_aprovados.to_csv(
    'alunos_aprovados.csv',
    index=False,
    sep=';',  # Usar ponto-e-vírgula em vez de vírgula
    encoding='utf-8'  # Codificação de caracteres
)

1 resposta
solução!

Olá, Estudante. Como vai?

Parabéns pela excelente iniciativa de organizar e compartilhar esse resumo dos passos do desafio! O seu material ficou extremamente didático, claro e muito bem estruturado. Com certeza vai ajudar muitos colegas que estão navegando pelo curso de Pandas e buscando consolidar esses conceitos essenciais de manipulação de dados.

Para enriquecer ainda mais o seu tópico e trazer algumas boas práticas de mercado sobre o que você postou, preparei alguns complementos importantes para cada um dos passos:

Tratamento de Dados Nulos (Passo 1)

Quando utilizamos o método fillna(), é uma boa prática lembrar que, por padrão, o Pandas não altera o DataFrame original, ele apenas retorna uma cópia com a alteração. Para que a mudança seja salva na coluna correspondente, precisamos reatribuir o resultado:

df['Notas'] = df['Notas'].fillna(0)

Uma alternativa muito utilizada para manter o código limpo ao preencher valores nulos em múltiplas colunas com critérios diferentes é passar um dicionário para o fillna():

valores_padrao = {'Notas': 0, 'Frequência': 1.0}
df = df.fillna(value=valores_padrao)

Remoção de Registros Específicos (Passo 2)

A sua explicação sobre o operador de negação de bits ~ foi perfeita! Ele é uma ferramenta poderosa no Pandas.

Complementando o seu Método 2, vale destacar que o uso do drop() por índices pode ser perigoso se o DataFrame tiver passado por filtragens anteriores, pois os índices mudam. Uma forma segura e dinâmica de usar o drop() sem fixar os números dos índices manualmente é combinando-o com uma seleção condicional:

indices_para_remover = df[df['Aluno'].isin(['Alice', 'Carlos'])].index
df = df.drop(indices_para_remover)

Substituição de Valores com replace() (Bônus)

Como o objetivo do desafio também mencionava o ajuste de notas substituindo o valor 7.0 por 8.0, podemos aplicar o método replace() diretamente na coluna desejada:

df['Notas'] = df['Notas'].replace(7.0, 8.0)

Se quisermos fazer essa alteração de forma segura apenas para quem já foi filtrado no DataFrame de aprovados, o uso do .copy() que você bem destacou no Passo 3 garante que essa operação ocorra sem nenhum aviso de erro do sistema.

Continue compartilhando seus estudos e códigos por aqui. Documentar o aprendizado dessa forma é uma das estratégias mais eficazes para fixar o conhecimento e construir um ótimo portfólio!

Espero que possa ter lhe ajudado!