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)