Passo 1: Carregar os dados
import pandas as pd
# Carregar o arquivo CSV. O separador é a vírgula.
df_notas = pd.read_csv("Média de notas.csv")
# Exibir as primeiras linhas e o tipo de dados
print("Primeiras 5 linhas do DataFrame:")
print(df_notas.head())
print("\nInformações sobre as colunas e tipos de dados:")
print(df_notas.info())
Análise dos dados iniciais:
# 1. Limpar linhas vazias (NaN em todas as colunas de notas)
df_notas = df_notas.dropna(how='all', subset=['Aluno', 'Prova 1', 'Prova 2', 'Prova 3', 'Prova 4', 'Nota final'])
# 2. Converter as colunas de notas para numérico.
# Substituir vírgula por ponto (para padrão numérico americano)
colunas_notas = ['Prova 1', 'Prova 2', 'Prova 3', 'Prova 4']
for col in colunas_notas:
# A função .str.replace() funciona em colunas do tipo string/object
if df_notas[col].dtype == 'object':
df_notas[col] = df_notas[col].str.replace(',', '.', regex=False)
# Tentar converter para float. O parâmetro errors='coerce' transformará
# quaisquer valores que não possam ser convertidos em NaN.
df_notas[col] = pd.to_numeric(df_notas[col], errors='coerce')
# 3. Remover linhas que podem ter ficado totalmente NaN após a conversão
# (embora o passo 1 já tenha removido as linhas totalmente vazias)
df_notas = df_notas.dropna(subset=colunas_notas, how='all')
# Re-verificar os tipos de dados
print("\nTipos de dados após a limpeza e conversão:")
print(df_notas.info())
Os dados agora estão limpos e as colunas de notas são do tipo float64
, prontas para o cálculo.
Resolução da Questão (Passo a Passo da Imagem)
Passo 2: Calcular a 'Nota final'
Conforme a imagem, a Nota final é a média das 4 provas.
# Calcular a média das 4 provas (excluindo a coluna 'Aluno' e 'Nota final' se fosse o caso, mas as colunas são claramente as 4 provas)
df_notas['Nota final'] = df_notas[colunas_notas].mean(axis=1)
print("\nDataFrame com a 'Nota final' calculada (Primeiras 5 linhas):")
print(df_notas.head())
Passo 3: Criar a coluna 'Status'
Conforme a imagem, o Status é definido por:
- Aprovado:
Nota final
$\geq 7.0$ - Recuperação: $5.0 \leq$
Nota final
$< 7.0$ - Reprovado:
Nota final
$< 5.0$
import numpy as np
# Definir as condições e os valores correspondentes
condicoes = [
(df_notas['Nota final'] >= 7.0),
(df_notas['Nota final'] >= 5.0) & (df_notas['Nota final'] < 7.0),
(df_notas['Nota final'] < 5.0)
]
valores = ['Aprovado', 'Recuperação', 'Reprovado']
# Criar a coluna 'Status'
df_notas['Status'] = np.select(condicoes, valores, default='Indefinido') # 'Indefinido' é para NaN ou outros casos
print("\nDataFrame com a coluna 'Status' (Primeiras 5 linhas):")
print(df_notas[['Aluno', 'Nota final', 'Status']].head())
Passo 4: Contar o número de alunos em cada 'Status'
contagem_status = df_notas['Status'].value_counts()
print("\nContagem de alunos por Status:")
print(contagem_status)
Passo 5: Aluno com a maior e a menor 'Nota final'
# Aluno com a maior Nota final
aluno_maior_nota = df_notas.loc[df_notas['Nota final'].idxmax()]
# Aluno com a menor Nota final
aluno_menor_nota = df_notas.loc[df_notas['Nota final'].idxmin()]
print("\nAluno(a) com a MAIOR Nota final:")
print(f"Nome: {aluno_maior_nota['Aluno']}")
print(f"Nota final: {aluno_maior_nota['Nota final']:.2f}")
print("\nAluno(a) com a MENOR Nota final:")
print(f"Nome: {aluno_menor_nota['Aluno']}")
print(f"Nota final: {aluno_menor_nota['Nota final']:.2f}")
Resultado Final
O resultado final, conforme solicitado, é a apresentação das informações calculadas.
1. Contagem de Alunos por Status:
Status | Número de Alunos |
---|---|
Aprovado | ${contagem_status['Aprovado']}$ |
Recuperação | ${contagem_status['Recuperação']}$ |
Reprovado | ${contagem_status['Reprovado']}$ |
2. Aluno com a Maior Nota Final:
- Nome: ${aluno_maior_nota['Aluno']}$
- Nota Final: ${aluno_maior_nota['Nota final']:.2f}$
3. Aluno com a Menor Nota Final:
- Nome: ${aluno_menor_nota['Aluno']}$
- Nota Final: ${aluno_menor_nota['Nota final']:.2f}$
4. O DataFrame final com todos os alunos, Nota final e Status está disponível abaixo:
{df_notas[['Aluno', 'Nota final', 'Status']].to_markdown(index=False, floatfmt=".2f")}