Establecer el orden de las columnas en el marco de datos de pandas

104

¿Hay alguna forma de reordenar las columnas en el marco de datos de pandas en función de mis preferencias personales (es decir, no ordenadas alfabéticamente o numéricamente, sino más bien siguiendo ciertas convenciones)?

Ejemplo simple:

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

produce esto:

   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

Pero en cambio, me gustaría esto:

   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, proporcione una solución genérica en lugar de específica para este caso. Muchas gracias).

Durbachit
fuente

Respuestas:

157

Simplemente seleccione el orden usted mismo escribiendo los nombres de las columnas. Tenga en cuenta los corchetes dobles:

frame = frame[['column I want first', 'column I want second'...etc.]]
A.Kot
fuente
26
Esto solo funciona con este pequeño ejemplo. Si está leyendo datos de otra fuente, como un archivo csv o una tabla de base de datos, no puede usar esta respuesta. Y esos parecen ser mucho más comunes. El OP solicitó una solución general.
chrisfs
84

Puedes usar esto:

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

frame = frame.reindex(columns=columnsTitles)
Okroshiashvili
fuente
6
Aunque la mayoría de las otras soluciones son más concisas, consideraría que esta es la más legible para cualquiera que no esté familiarizado al 100% pandas.
Dirk
3
Sin embargo, recuerde asignar el valor de retorno a una variable, esto no modifica el orden de las columnas en el lugar (al menos no en pandasv0.23`).
Dirk
Gracias @Dirk por la sugerencia
Okroshiashvili
33

Aquí hay una solución que uso con mucha frecuencia. Cuando tiene un gran conjunto de datos con toneladas de columnas, definitivamente no desea reorganizar manualmente todas las columnas.

Lo que puede y, muy probablemente, desea hacer es ordenar las primeras columnas que usa con frecuencia y dejar que todas las demás columnas sean ellas mismas. Este es un enfoque común en R.df %>%select(one, two, three, everything())

Por lo tanto, primero puede escribir manualmente las columnas que desea ordenar y colocar antes de todas las demás columnas en una lista cols_to_order.

Luego construye una lista para nuevas columnas combinando el resto de las columnas:

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

Después de esto, puede utilizar las new_columnsotras soluciones 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
fuente
1
brillante, perfecto. gracias por evitar que tenga que escribir cada nombre de columna o índice
Stuart
Esta es la respuesta general y debería ser la respuesta aceptada
CarlosH
26

También podrías hacer 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

Además, puede obtener la lista de columnas con:

cols = list(df.columns.values)

La salida producirá algo como esto:

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

Que luego es fácil de reorganizar manualmente.

omri_saadon
fuente
13

Constrúyelo con una lista en lugar de un diccionario.

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
fuente
No pude obtener 'nombre de columna': datos para trabajar dentro de una lista como lo hace en un dictado.
Kim Miller
10

También puede 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
fuente
6

Agregue el parámetro 'columnas':

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
fuente
4

Intente indexar (por lo que desea una solución genérica no solo para esto, por lo que el orden de índice puede ser justo lo que desea):

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

Ahora:

print(frame)

Es:

   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-Adelante
fuente
-2

Encuentro que esto es el más sencillo y 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
fuente