1
resposta

[Projeto] Projeto

Olá! Segue uma possível resolução do desafio utilizando Pandas.

Primeiro, importamos a biblioteca e lemos o arquivo CSV:

import pandas as pd

dados = pd.read_csv('alunos.csv')
  1. Criando a coluna Pontos_extras

Os pontos extras correspondem a 40% da nota atual de cada aluno:

dados['Pontos_extras'] = dados['Notas'] * 0.4

Também poderia ser feito com apply:

dados['Pontos_extras'] = dados['Notas'].apply(lambda x: x * 0.4)
  1. Criando a coluna Notas_finais

A nota final será a soma da nota atual com os pontos extras:

dados['Notas_finais'] = dados['Notas'] + dados['Pontos_extras']
  1. Criando a coluna Aprovado_final

Se a nota final for maior ou igual a 6, o aluno estará aprovado. Caso contrário, estará reprovado:

dados['Aprovado_final'] = dados['Notas_finais'].apply(lambda x: True if x >= 6 else False)
  1. Selecionando os alunos que não tinham sido aprovados antes, mas foram aprovados depois dos pontos extras:
dados.query('Aprovado == False & Aprovado_final == True')

Outra forma de fazer a mesma seleção seria:

selecao = (dados['Aprovado'] == False) & (dados['Aprovado_final'] == True)

dados[selecao]

Código completo:

import pandas as pd

dados = pd.read_csv('alunos.csv')

dados['Pontos_extras'] = dados['Notas'] * 0.4

dados['Notas_finais'] = dados['Notas'] + dados['Pontos_extras']

dados['Aprovado_final'] = dados['Notas_finais'].apply(lambda x: True if x >= 6 else False)

dados.query('Aprovado == False & Aprovado_final == True')
1 resposta

Olá, Filipe. Como vai?

Muito bacana a sua iniciativa de compartilhar a resolução detalhada do seu desafio aqui no fórum! O seu código está excelente, muito bem estruturado e fácil de entender. A forma como você construiu o raciocínio passo a passo antes de apresentar o script final é uma ótima prática de documentação. Também é muito legal ver que você explorou diferentes maneiras de fazer a mesma coisa, como o uso do método query versus a criação de máscaras booleanas.

Para agregar ainda mais valor ao seu aprendizado e trazer algumas práticas comuns do dia a dia com Pandas, deixo aqui duas sugestões de otimização para o seu projeto:

  • **Vetorização nativa em vez de apply**: No Pandas, operações "vetorizadas" (que atuam na coluna inteira de uma vez) são muito mais rápidas do que o uso do apply com funções lambda. Você usou a vetorização perfeitamente ao fazer dados['Notas'] * 0.4. Essa mesma lógica pode ser aplicada na hora de criar a coluna de aprovação. O Pandas avalia condições lógicas nativamente e já retorna True ou False, permitindo simplificar o código:
# O Pandas já entende que deve retornar True se a condição for atendida e False caso não seja
dados['Aprovado_final'] = dados['Notas_finais'] >= 6
  • Operador de negação (~) e booleanos diretos: Na sua seleção com máscaras, você utilizou (dados['Aprovado'] == False) & (dados['Aprovado_final'] == True). Como essas colunas já guardam valores booleanos, você não precisa compará-las explicitamente com True ou False. Você pode usar apenas o nome da coluna para os verdadeiros, e o operador ~ (til, que significa "não" no Pandas) para os falsos. Veja como a sintaxe fica concisa:
# O til (~) inverte o resultado, selecionando os falsos da primeira coluna
selecao = (~dados['Aprovado']) & (dados['Aprovado_final'])
dados[selecao]

Essas dicas ajudam a deixar o seu código ainda mais limpo e "idiomático" (escrito da forma como a biblioteca foi otimizada para funcionar), o que faz bastante diferença quando trabalhamos com bases de dados que possuem milhões de linhas.

A sua solução original já resolve o desafio perfeitamente. Continue com essa excelente dedicação aos estudos!

Espero que possa ter lhe ajudado!