Imposta l'ordine delle colonne nel dataframe panda


104

C'è un modo per riordinare le colonne nel dataframe dei panda in base alle mie preferenze personali (cioè non ordinate alfabeticamente o numericamente, ma più simili a certe convenzioni)?

Esempio semplice:

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

produce questo:

   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

Ma invece, vorrei questo:

   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

(Si prega di fornire una soluzione generica piuttosto che specifica per questo caso. Molte grazie.)

Risposte:


157

Seleziona tu stesso l'ordine digitando i nomi delle colonne. Nota le doppie parentesi:

frame = frame[['column I want first', 'column I want second'...etc.]]

26
Funziona solo con questo esempio piuttosto piccolo. Se stai leggendo dati da un'altra fonte, come un file CSV o una tabella di database, non puoi usare questa risposta. E quelli sembrano essere molto più comuni. Il PO ha chiesto una soluzione generale.
Chrisfs

84

Puoi usare questo:

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

frame = frame.reindex(columns=columnsTitles)

6
Anche se la maggior parte delle altre soluzioni sono più concise, la considero la più leggibile per chiunque non abbia familiarità al 100% pandas.
Dirk

3
Ricorda di assegnare il valore di ritorno a una variabile, questo non modifica l'ordine delle colonne sul posto (almeno non nella pandasv0.23`).
Dirk

Grazie @Dirk per il suggerimento
Okroshiashvili

33

Ecco una soluzione che uso molto spesso. Quando si dispone di un ampio set di dati con tonnellate di colonne, non è assolutamente necessario riorganizzare manualmente tutte le colonne.

Quello che puoi e, molto probabilmente, vuoi fare è ordinare solo le prime poche colonne che usi frequentemente e lasciare che tutte le altre colonne siano solo se stesse. Questo è un approccio comune in R.df %>%select(one, two, three, everything())

Quindi puoi prima digitare manualmente le colonne che vuoi ordinare e da posizionare prima di tutte le altre colonne in un elenco cols_to_order.

Quindi costruisci un elenco per nuove colonne combinando il resto delle colonne:

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

Dopo questo, puoi usare new_columnscome altre soluzioni suggerite.

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

1
brillante, perfetto. grazie per avermi impedito di digitare il nome di ogni colonna o indice
stuart

Questa è la risposta generale e dovrebbe essere la risposta accettata
CarlosH

26

Potresti anche fare qualcosa di simile 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

Inoltre, puoi ottenere l'elenco delle colonne con:

cols = list(df.columns.values)

L'output produrrà qualcosa del genere:

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

Che è quindi facile da riorganizzare manualmente.


13

Costruiscilo con un elenco invece di un dizionario

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

Non sono riuscito a ottenere "nome colonna": dati per lavorare all'interno di un elenco come in un dict.
Kim Miller

10

Puoi anche usare 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

6

Aggiungi il parametro "colonne":

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']
)

4

Prova a indicizzare (quindi vuoi una soluzione generica non solo per questo, quindi l'ordine dell'indice può essere proprio quello che vuoi):

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

Adesso:

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

-2

Trovo che questo sia il più semplice e funzionante:

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']]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.