1
resposta

Mão na massa: analisando planilha e gerando gráficos

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:

StatusNú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")}

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta

Oi, Isaquealves! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Gostei de ver como você estruturou o código! O passo a passo facilita a análise e garante que os cálculos sejam precisos.

Uma dica interessante para o futuro é utilizar o método .round() para arredondar os valores da nota final, deixando os resultados mais legíveis:


# Arredondar a nota final para 2 casas decimais
df_notas['Nota final'] = df_notas['Nota final'].round(2)

print(df_notas[['Aluno', 'Nota final', 'Status']].head())

Isso arredonda os números e mantém o DataFrame fácil de interpretar, principalmente para relatórios ou gráficos.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!