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

Ordenando um DataFrame pandas pelo nome das colunas (ordem alfabética)

import pandas as pd

temps = {
    'Maxine': [98.6, 96.9, 97.7], 
    'James': [98.9, 100.3, 101.1], 
    'Amanda': [98.5, 98.3, 98.7]
}

temperatures = pd.DataFrame(temps, 
                            index=['Morning', 'Afternoon','Evening'])

O dataframe gerado foi:

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

Como eu tentei ordenar:

temperatures.sort_values(by=temperatures.columns, ascending=True)

Mas não funciona: erro:

raise KeyError(key)
KeyError: Index(['Maxine', 'James', 'Amanda'], dtype='object')

O que estou fazendo de errado?

4 respostas
solução!

Oi Edson, tudo bom?

Para reordenar as colunas do dataframe, é mais fácil usar a função sort_index do Pandas. Você pode fazer da seguinte maneira:

temperatures.sort_index(axis=1, inplace=True)

O axis=1 indica que ele deve reordenar as colunas, e o inplace=True para que não precise fazer a atribuição do dataframe à ele mesmo com a alteração, ficando tudo numa linha só.

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

Obrgiado, Paulo Francis Suchoj de Souza . EU gostaria de entender o que eu precisaria modificar no meu código para ordenar com sort_values . É possível?

Infelizmente não, Edson, com o sort_values() não tem como ordenar as colunas em ordem alfabética. Isso porque ele se baseia nos valores dentro do dataframe, e não nos índices deles.

Os valores são todos os dados que estão dentro do nosso dataframe, como as temperaturas mensuradas de cada pessoa. Os índices são os nomes das colunas (Maxine, James e Amanda) e das linhas (Afternoon, Morning e Evening).

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

Com o sort_values() você consegue mudar a ordem em que as linhas aparecem no dataframe. No exemplo abaixo, criamos o dataframe e mandamos ordenar pelos valores da coluna Maxine; veja como ele passa a exibir as temperaturas da coluna Maxine de forma crescente:

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

Essa reordenação se baseia nos valores da coluna passada na função, e também é possível reordenar pelos valores de uma linha, com os parâmetros by e axis:

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

Contudo, como citei anteriormente, a sort_values() não faz a reordenação diretamente pelos índices. Ele pode até trocar as colunas de lugar quando se faz reordenação dos valores, como na screenshot acima, mas apenas para obedecer a organização crescente ou decrescente

Para a reordenação das colunas de maneira alfabética, tem que ser da maneira descrita na resposta anterior, com a sort_index(), ou como alternativa, usando a função sorted():

temperatures.columns = sorted(temperatures.columns)

E ainda, uma outra alternativa, fazendo a listagem explícita na ordem desejada de maneira manual:

temperatures = temperatures[['Amanda', 'James', Maxine']]

Porém, com a sort_values(), dá para mexer apenas se baseando nos valores dentro das colunas e linhas do dataframe :)

Obrigado, Paulo Francis Suchoj de Souza !