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

Nomeando colunas

Olá!

Gostaria de saber como podemos nomear a coluna como Notas Médias no código de criação de DataFrame (mesma linha).

Tentei fazer da seguinte maneira:

alunos_media = pd.DataFrame(alunos_grupo['Notas'].mean().round(2), columns = ['Notas Médas'])
alunos_media

Mas acabou gerando um out somente com o nome da coluna, sem valores.

3 respostas

Olá, Vivian! Tudo bom?

A função pd.DataFrame() requer uma estrutura de array ou um iterável para funcionar. Quando nós utilizamos o alunos_grupo['Notas'].mean().round(2), erramos em dois pontos.

1) A parte alunos_grupo['Notas'].mean(), já retorna um valor do tipo float, que não possui método round(2) para ser utilizado, o round() é utilizado sobre objetos de tipo Numpy Array, Pandas Series e Pandas DataFrame. Isso pode ser um dos erros.

2) Se removessemos essa parte o round, ainda teríamos o problema de que é apenas um valor float, então precisamos indicar que é uma lista que estamos utilizando, uma lista com um único valor. E por fim, o DataFrame só teria apenas uma linha e uma coluna.

Então seria algo como:

pd.DataFrame([alunos_grupo['Notas'].mean()], columns=['Notas Médias'])

Se ainda tiver alguma dúvida, estou por aqui. Ótimos estudos e grande abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá, Marcus.

Você comentou que seria errado utilizar round( ) após usar mean( ), mas na resolução do exercício passado pela Alura foi o seguinte:

sexo = alunos.groupby('Sexo')
sexo = pd.DataFrame(sexo['Notas'].mean().round(2))
sexo.columns = ['Notas Médias']
sexo

Tentei usar o código que você passou, mas gerou um dataframe com valor NaN:! [](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

Não sei se ficou clara minha pergunta, vou tentar explicar melhor minha dúvida:

O que eu fiz e deu certo:

import pandas as pd
alunos = pd.DataFrame({'Nome': ['Ary', 'Cátia', 'Denis', 'Beto', 'Bruna', 'Dara', 'Carlos', 'Alice'], 
                        'Sexo': ['M', 'F', 'M', 'M', 'F', 'F', 'M', 'F'], 
                        'Idade': [15, 27, 56, 32, 42, 21, 19, 35], 
                        'Notas': [7.5, 2.5, 5.0, 10, 8.2, 7, 6, 5.6], 
                        'Aprovado': [True, False, False, True, True, True, False, False]}, 
                        columns = ['Nome', 'Idade', 'Sexo', 'Notas', 'Aprovado'])

alunos_grupo = alunos.groupby('Sexo')

alunos_media = pd.DataFrame(alunos_grupo['Notas'].mean().round(2))
alunos_media

![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

alunos_media.columns = ['Notas Médias']
alunos_media

Out final: ![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

Minha dúvida: Como gerar esse mesmo out final, porém, sem precisar criar um comando separado para renomear a coluna como 'Notas Médias'. Eu gostaria de já determinar o nome da coluna para 'Notas Médias' no momento em que eu estiver criando o DataFrame.

Agradeço desde já.

solução!

Opa. Olá, Vivian.

No exemplo que eu passei na resposta, eu considerei a variável alunos_grupo como sendo apenas uma lista de valores. Não considerei que era um objeto do tipo groupby. E por conta disso, a saída de quando usamos o mean() ainda é uma Series do Pandas, que se encaixa nos exemplos que comentei que funcionaria o uso do round(). Desse modo o exemplo que passei já não se aplica.

Vamos lá.

Uma das maneiras de criar um DataFrame com um nome de coluna especificado, é passando um dicionário, onde a chave do dicionário será o nome da coluna, e o valor, será o conteúdo da coluna no DataFrame. Então podemos fazer:

import pandas as pd
alunos = pd.DataFrame({'Nome': ['Ary', 'Cátia', 'Denis', 'Beto', 'Bruna', 'Dara', 'Carlos', 'Alice'], 
                        'Sexo': ['M', 'F', 'M', 'M', 'F', 'F', 'M', 'F'], 
                        'Idade': [15, 27, 56, 32, 42, 21, 19, 35], 
                        'Notas': [7.5, 2.5, 5.0, 10, 8.2, 7, 6, 5.6], 
                        'Aprovado': [True, False, False, True, True, True, False, False]}, 
                        columns = ['Nome', 'Idade', 'Sexo', 'Notas', 'Aprovado'])

alunos_grupo = alunos.groupby('Sexo')
alunos_media = pd.DataFrame({'Notas Médias': alunos_grupo['Notas'].mean().round(2)})
alunos_media

Como a nossa pandas.Series tem um nome que veio da operação do groupby(), se não adicionarmos nada, a função pandas.DataFrame() reutiliza o nome da Series como nome da coluna. E se nós sabemos esse nome, também podemos usar o método rename(). Exemplo:

import pandas as pd
alunos = pd.DataFrame({'Nome': ['Ary', 'Cátia', 'Denis', 'Beto', 'Bruna', 'Dara', 'Carlos', 'Alice'], 
                        'Sexo': ['M', 'F', 'M', 'M', 'F', 'F', 'M', 'F'], 
                        'Idade': [15, 27, 56, 32, 42, 21, 19, 35], 
                        'Notas': [7.5, 2.5, 5.0, 10, 8.2, 7, 6, 5.6], 
                        'Aprovado': [True, False, False, True, True, True, False, False]}, 
                        columns = ['Nome', 'Idade', 'Sexo', 'Notas', 'Aprovado'])

alunos_grupo = alunos.groupby('Sexo')
alunos_media = pd.DataFrame(alunos_grupo['Notas'].mean().round(2)).rename(columns={'Notas': 'Notas Médias'})
alunos_media

E ambos resultam na seguinte saída:

SexoNotas Médias
F5.82
M7.12

Se ainda tiver alguma dúvida, estou por aqui. Ótimos estudos e grande abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!