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).

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.]]

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)

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

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.


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

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

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

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

-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']]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.