Reordenar las columnas en el dataframe de pandas basado en el nombre de la columna

Tengo un dataframe con más de 200 columnas. El problema es que a medida que se generó el pedido es.

 ['Q1.3','Q6.1','Q1.2','Q1.1',......] 

Necesito reordenar las columnas de la siguiente manera:

 ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......] 

¿Hay alguna manera de hacer esto dentro de Python?

 df = df.reindex(sorted(df.columns), axis=1) 

Esto supone que la clasificación de los nombres de las columnas le dará el orden que desee. Si los nombres de sus columnas no se ordenan lexicográficamente (por ejemplo, si desea que la columna Q10.3 aparezca después de Q9.1), tendrá que clasificar de manera diferente, pero eso no tiene nada que ver con los pandas.

También puedes hacer más sucintamente:

 df.sort_index(axis=1) 

Asegúrate de volver a asignar el resultado:

 df = df.sort_index(axis=1) 

O, hazlo en el lugar:

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

Usted puede simplemente hacer:

 df [ordenado (df.columns)]

Edit: Shorter is

 df[sorted(df)] 

La respuesta de Tweet se puede pasar a la respuesta de BrenBarn arriba con

 data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1) 

Así que para su ejemplo, diga:

 vals = randint(low=16, high=80, size=25).reshape(5,5) cols = ['Q1.3', 'Q6.1', 'Q1.2', 'Q9.1', 'Q10.2'] data = DataFrame(vals, columns = cols) 

Usted obtiene:

 data Q1.3 Q6.1 Q1.2 Q9.1 Q10.2 0 73 29 63 51 72 1 61 29 32 68 57 2 36 49 76 18 37 3 63 61 51 30 31 4 36 66 71 24 77 

Entonces hazlo:

 data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1) 

Resultando en:

 data Q1.2 Q1.3 Q6.1 Q9.1 Q10.2 0 2 0 1 3 4 1 7 5 6 8 9 2 2 0 1 3 4 3 2 0 1 3 4 4 2 0 1 3 4 

No olvide agregar “inplace = True” a la respuesta de Wes o establecer el resultado en un nuevo DataFrame.

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

Si necesita una secuencia arbitraria en lugar de una secuencia ordenada, podría hacer:

 sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......] your_dataframe = your_dataframe.reindex(columns=sequence) 

Probé esto en 2.7.10 y funcionó para mí.

Para varias columnas, puedes poner columnas para ordenar lo que quieras:

 #['A', 'B', 'C'] <-this is your columns order df = df[['C', 'B', 'A']] 

Este ejemplo muestra columnas de clasificación y corte:

 d = {'col1':[1, 2, 3], 'col2':[4, 5, 6], 'col3':[7, 8, 9], 'col4':[17, 18, 19]} df = pandas.DataFrame(d) 

Usted obtiene:

 col1 col2 col3 col4 1 4 7 17 2 5 8 18 3 6 9 19 

Entonces hazlo:

 df = df[['col3', 'col2', 'col1']] 

Resultando en:

 col3 col2 col1 7 4 1 8 5 2 9 6 3 

El método más rápido es:

 df.sort_index(axis=1) 

Tenga en cuenta que esto crea una nueva instancia. Por lo tanto, necesita almacenar el resultado en una nueva variable:

 sortedDf=df.sort_index(axis=1) 

El método de sorted y la función sorted permiten proporcionar una función personalizada para extraer la clave utilizada para la comparación:

 >>> ls = ['Q1.3', 'Q6.1', 'Q1.2'] >>> sorted(ls, key=lambda x: float(x[1:])) ['Q1.2', 'Q1.3', 'Q6.1'] 

Un caso de uso es que usted ha nombrado (algunas de) sus columnas con algún prefijo, y desea que las columnas se ordenen con esos prefijos, todos juntos y en algún orden en particular (no alfabético).

Por ejemplo, puede comenzar todas sus funciones con Ft_ , tags con Lbl_ , etc., y primero desea todas las columnas sin prefijo, luego todas las funciones, luego la etiqueta. Puede hacer esto con la siguiente función (notaré un posible problema de eficiencia al usar la sum para reducir las listas, pero esto no es un problema a menos que tenga MUCHAS columnas, que no tengo):

 def sortedcols(df, groups = ['Ft_', 'Lbl_'] ): return df[ sum([list(filter(re.compile(r).search, list(df.columns).copy())) for r in (lambda l: ['^(?!(%s))' % '|'.join(l)] + ['^%s' % i for i in l ] )(groups) ], []) ] 
 print df.sort_index(by='Frequency',ascending=False) 

donde by es el nombre de la columna, si desea ordenar el conjunto de datos según la columna