Preservando el orden de las columnas en Python Pandas DataFrame

¿Hay una manera de preservar el orden de las columnas en un archivo csv cuando se lee y se escribe con Python Pandas? Por ejemplo, en este código.

import pandas as pd data = pd.read_csv(filename) data.to_csv(filename) 

los archivos de salida pueden ser diferentes porque las columnas no se conservan.

Parece que hay un error en la versión actual de Pandas (‘0.11.0’), lo que significa que la respuesta de Matti John no funcionará. Si especifica columnas para escribir en el archivo, se escriben en orden alfabético, pero simplemente se vuelven a marcar según la lista en columnas. Por ejemplo, este código:

 import pandas dfdict={} dfdict["a"]=[1,2,3,4] dfdict["b"]=[5,6,7,8] dfdict["c"]=[9,10,11,12] df=pandas.DataFrame(dfdict) df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"]) 

resulta en esta salida (incorrecta):

  bac 0 1 5 9 1 2 6 10 2 3 7 11 3 4 8 12 

Puedes verificar qué versión de pandas has instalado ejecutando:

 pandas.version.version 

La documentación para to_csv está aquí.

En realidad, parece que este es un error conocido y se solucionará en una próxima versión (0.11.1):

https://github.com/pydata/pandas/issues/3489

ACTUALIZACIÓN: Todavía no ha habido una nueva versión de pandas, pero hay una solución que se describe aquí, que no requiere el uso de una versión diferente de pandas:

github.com/pydata/pandas/issues/3454

Por lo tanto, el cambio de la última línea en el bloque de código anterior a lo siguiente funcionará correctamente:

 df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"], engine='python') 

ACTUALIZACIÓN Parece que el argumento “cols” ha sido renombrado a “columnas” y que el argumento “motor” está en desuso (ya no está disponible) en versiones recientes de pandas. Además, este error se corrige en la versión 0.19.0.

El orden de las columnas generalmente debe conservarse al leer y luego escribir un archivo csv así, pero si por alguna razón no están en el orden que usted desea, puede usar el argumento de palabra clave de columns en to_csv .

Por ejemplo, si tiene un csv con las columnas a, b, c, d:

 data = pd.read_csv(filename) data.to_csv(filename, columns=['a', 'b', 'c', 'd']) 

Otra solución es hacer esto:

 import pandas as pd data = pd.read_csv(filename) data2 = df[['A','B','C']] #put 'A' 'B' 'C' in the desired order data2.to_csv(filename)