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

Argumentos do Sort_values

Olá pessoal, boa noite.

Minha dúvida é a seguinte. Em um exercicio da alura eu tive que ordenar os alunos pela idade, colocando os mais novos primeiro. E após isso eu teria que montar um dataframe somente com os 3 primeiros. Para isso eu utilizei a seguinte linha de código, sendo alunos = meu dataframe inicial.

df2 = alunos.sort_values(by = ['Idade']).iloc[0:3] df2

e obtive a resposta que esperava:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeContudo, o gabarito estava incluindo na função sort_values o argumento inplace = True, fazendo com que o código ficasse assim:

df2 = alunos.sort_values(by = ['Idade'], inplace = True).iloc[0:3] df2

Contudo, quando faço isso dá erro. Minha dúvida é: porque quando coloco o inplace = True o pandas retorna erro?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas
solução!

Olá Ronaldo! Tudo tranquilo?

O que acontece é que, quando usamos o inplace = True a alteração será realizada diretamente no dataframe original, e não teremos nenhum retorno para atribuir a uma nova variável. Por outro lado, se fizermos a alteração sem o inplace = True teremos como retorno um dataframe que podemos armazenar em uma nova variável.

Para entendermos melhor isso, fiz um dataframe semelhante ao que você está utilizando para utilizarmos como exemplo.

# dataframe exemplo com as idades sem ordenar

data = {
    'Nome': ['Carlos', 'Ary', 'Dara'],
    'Sexo': ['M', 'M', 'F'],
    'Idade': [19, 15, 21],
    'Notas': [6.0, 7.5, 7.0],
    'Aprovado': [False, True, True]
}

alunos = pd.DataFrame(data)
alunos

Se executarmos uma célula com o seguinte código:

alunos.sort_values(by = ['Idade'])

Teremos como retorno:

NomeSexoIdadeNotasAprovado
1AryM157.5True
0CarlosM196False
2DaraF217True

Que é o dataframe ordenado pela coluna “Idade”. No entanto, se na célula seguinte visualizarmos o dataframe alunos, iremos perceber que ele não estará mais ordenado, isso porque, não fizemos nenhuma alteração diretamente no dataframe e nem salvamos o dataframe ordenado em uma outra variável.

Agora, se executarmos o seguinte código em uma célula:

alunos.sort_values(by = ['Idade'], inplace = True)

Não teremos nada como retorno dessa célula. Isso porque, colocando o inplace = True, o sort_values será aplicado diretamente no seu dataframe alunos, e não retornará nenhum outro dataframe com as alterações. Por isso que, quando você faz df2 = alunos.sort_values(by = ['Idade'], inplace = True).iloc[0:3] é retornado um erro, porque, nesse trecho de código, você está tentando utilizar o iloc para selecionar algumas linhas, de um trecho de código que não está te retornando um dataframe.

Dessa forma, para que você consiga fazer essa seleção após ter utilizado o inplace = True, você pode fazer o seguinte:

# ordenando o dataframe original pelas idades
alunos.sort_values(by = ['Idade'], inplace = True)

# salvando em uma nova variável apenas os 3 primeiros alunos
df2 = alunos.iloc[0:3]
df2

Assim, você está selecionando as linhas do dataframe alunos, após ser ordenado de acordo com as idades :)

Espero que tenha conseguido te ajudar. Qualquer dúvida estou por aqui, tá bom?

Bons estudos!

Muito obrigado Milena, me ajudou bastante.