¿Cómo intercambiar dos columnas DataFrame?

En MATLAB, para intercambiar la primera y la segunda columnas de una tabla A , uno haría esto 1

 A = A(:, [2 1 3:end]); 

¿Existe una forma igualmente conveniente de hacerlo si A fuera un DataFrame pandas?

1 MATLAB utiliza la indexación basada en 1.

Pandas tiene un método de reindexación que lo hace. Solo tiene que dar una lista con los nombres de las columnas en el orden que desee:

 columnsTitles=["B","A"] df=df.reindex(columns=columnsTitles) 

Aclamaciones

Una ligera variante en la respuesta de acushner:

 # get a list of the columns col_list = list(df) # use this handy way to swap the elements col_list[0], col_list[1] = col_list[1], col_list[0] # assign back, the order will now be swapped df.columns = col_list 

ejemplo:

 In [39]: df = pd.DataFrame({'a':randn(3), 'b':randn(3), 'c':randn(3)}) df Out[39]: abc 0 -0.682446 -0.200654 -1.609470 1 -1.998113 0.806378 1.252384 2 -0.250359 3.774708 1.100771 In [40]: col_list = list(df) col_list[0], col_list[1] = col_list[1], col_list[0] df.columns = col_list df Out[40]: bac 0 -0.682446 -0.200654 -1.609470 1 -1.998113 0.806378 1.252384 2 -0.250359 3.774708 1.100771 

ACTUALIZAR

Si solo desea cambiar el orden de las columnas sin cambiar el contenido de las columnas, puede volver a indexar utilizando una indexación elegante:

 In [34]: cols = list(df) cols[1], cols[0] = cols[0], cols[1] cols Out[34]: ['b', 'a', 'c'] In [35]: df.ix[:,cols] Out[35]: bac 0 -0.200654 -0.682446 -1.609470 1 0.806378 -1.998113 1.252384 2 3.774708 -0.250359 1.100771 

Finalmente me conformé con esto:

 A = A.iloc[:, [1, 0] + range(2, A.shape[1])] 

Es mucho menos conveniente que la versión MATLAB, pero me gusta el hecho de que no requiere la creación de variables temporales.

 c = A.columns A = A[c[np.r_[1, 0, 2:len(c)]]] 

o, aún más fácil:

 A[[c[0], c[1]]] = A[[c[1], c[0]]] 

* Edición: corregida por las sugerencias de Ivan.

Si tiene varias columnas y el rendimiento y la memoria no son un problema, simplemente puede usar esta función:

 def swap_columns(df, c1, c2): df['temp'] = df[c1] df[c1] = df[c2] df[c2] = df_organizations['temp'] df.drop(columns=['temp'], inplace=True)