Definir a ordem das colunas no dataframe do pandas

104

Existe uma maneira de reordenar colunas no dataframe do pandas com base na minha preferência pessoal (ou seja, não em ordem alfabética ou numérica, mas mais como seguir certas convenções)?

Exemplo simples:

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

produz isto:

   one thing other thing  second thing
0          1           a           0.1
1          2           e           0.2
2          3           i           1.0
3          4           o           2.0

Mas em vez disso, eu gostaria disso:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

(Por favor, forneça uma solução genérica em vez de específica para este caso. Muito obrigado.)

Durbachit
fonte

Respostas:

157

Basta selecionar você mesmo o pedido, digitando os nomes das colunas. Observe os colchetes duplos:

frame = frame[['column I want first', 'column I want second'...etc.]]
A.Kot
fonte
25
Isso só funciona com este pequeno exemplo. Se você estiver lendo dados de outra fonte, como um arquivo csv ou uma tabela de banco de dados, não poderá usar esta resposta. E esses parecem ser muito mais comuns. O OP solicitou uma solução geral.
chrisfs
83

Você pode usar isto:

columnsTitles = ['onething', 'secondthing', 'otherthing']

frame = frame.reindex(columns=columnsTitles)
Okroshiashvili
fonte
5
Mesmo que a maioria das outras soluções sejam mais concisas, eu consideraria esta a mais legível para qualquer pessoa que não esteja 100% familiarizada com ela pandas.
Dirk
3
Lembre-se de atribuir o valor de retorno a uma variável, porém, isso não modifica a ordem das colunas no local (pelo menos não na pandasv0.23`).
Dirk
Obrigado @Dirk pela sugestão
Okroshiashvili
33

Aqui está uma solução que uso com frequência. Quando você tem um grande conjunto de dados com toneladas de colunas, definitivamente não quer reorganizar manualmente todas as colunas.

O que você pode e, provavelmente, deseja fazer é apenas ordenar as primeiras colunas que usa com frequência e deixar que todas as outras colunas sejam elas mesmas. Esta é uma abordagem comum em R.df %>%select(one, two, three, everything())

Portanto, você pode primeiro digitar manualmente as colunas que deseja ordenar e posicionar antes de todas as outras colunas em uma lista cols_to_order.

Em seguida, você constrói uma lista para novas colunas, combinando o restante das colunas:

new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())

Depois disso, você pode usar o new_columnscomo outras soluções sugeridas.

import pandas as pd
frame = pd.DataFrame({
    'one thing': [1, 2, 3, 4],
    'other thing': ['a', 'e', 'i', 'o'],
    'more things': ['a', 'e', 'i', 'o'],
    'second thing': [0.1, 0.2, 1, 2],
})

cols_to_order = ['one thing', 'second thing']
new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())
frame = frame[new_columns]

   one thing  second thing other thing more things
0          1           0.1           a           a
1          2           0.2           e           e
2          3           1.0           i           i
3          4           2.0           o           o
Lala La
fonte
1
brilhante, perfeito. obrigado por me impedir de digitar cada nome de coluna ou índice
stuart
Esta é a resposta geral e deve ser a resposta aceita
CarlosH
26

Você também pode fazer algo como df = df[['x', 'y', 'a', 'b']]

import pandas as pd
frame = pd.DataFrame({'one thing':[1,2,3,4],'second thing':[0.1,0.2,1,2],'other thing':['a','e','i','o']})
frame = frame[['second thing', 'other thing', 'one thing']]
print frame
   second thing other thing  one thing
0           0.1           a          1
1           0.2           e          2
2           1.0           i          3
3           2.0           o          4

Além disso, você pode obter a lista de colunas com:

cols = list(df.columns.values)

A saída produzirá algo assim:

['x', 'y', 'a', 'b']

O que é fácil de reorganizar manualmente.

omri_saadon
fonte
13

Construa-o com uma lista em vez de um dicionário

frame = pd.DataFrame([
        [1, .1, 'a'],
        [2, .2, 'e'],
        [3,  1, 'i'],
        [4,  4, 'o']
    ], columns=['one thing', 'second thing', 'other thing'])

frame

   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           4.0           o
piRSquared
fonte
Não consegui fazer com que 'nome da coluna': dados funcionassem dentro de uma lista como funciona em um dicionário.
Kim Miller
10

Você também pode usar OrderedDict:

In [183]: from collections import OrderedDict

In [184]: data = OrderedDict()

In [185]: data['one thing'] = [1,2,3,4]

In [186]: data['second thing'] = [0.1,0.2,1,2]

In [187]: data['other thing'] = ['a','e','i','o']

In [188]: frame = pd.DataFrame(data)

In [189]: frame
Out[189]:
   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o
MaxU
fonte
6

Adicione o parâmetro 'colunas':

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']},
        columns=['one thing', 'second thing', 'other thing']
)
irene
fonte
4

Tente indexar (então você deseja uma solução genérica não apenas para isso, então a ordem do índice pode ser exatamente o que você deseja):

l=[0,2,1] # index order
frame=frame[[frame.columns[i] for i in l]]

Agora:

print(frame)

É:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o
U10-Forward
fonte
-2

Acho que isso é o mais simples e funcional:

df = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

df = df[['one thing','second thing', 'other thing']]
Sando K
fonte