Ordene todas las columnas de un dataframe de pandas independientemente usando sort_values ​​()

Tengo un dataframe y quiero ordenar todas las columnas de forma independiente en orden descendente o ascendente.

import pandas as pd data = {'a': [5, 2, 3, 6], 'b': [7, 9, 1, 4], 'c': [1, 5, 4, 2]} df = pd.DataFrame.from_dict(data) abc 0 5 7 1 1 2 9 5 2 3 1 4 3 6 4 2 

Cuando uso sort_values ​​() para esto, no funciona como se esperaba (para mí) y solo ordena una columna:

 foo = df.sort_values(by=['a', 'b', 'c'], ascending=[False, False, False]) abc 3 6 4 2 0 5 7 1 2 3 1 4 1 2 9 5 

Puedo obtener el resultado deseado si uso la solución de esta respuesta que aplica una función lambda:

 bar = df.apply(lambda x: x.sort_values().values) print(bar) abc 0 2 1 1 1 3 4 2 2 5 7 4 3 6 9 5 

Pero esto me parece un poco torpe.

¿Qué está sucediendo realmente en el ejemplo de ordenar los valores () arriba y cómo puedo ordenar todas las columnas en mi dataframe en forma de pandas sin la función lambda?

Puedes usar numpy.sort con el constructor DataFrame :

 df1 = pd.DataFrame(np.sort(df.values, axis=0), index=df.index, columns=df.columns) print (df1) abc 0 2 1 1 1 3 4 2 2 5 7 4 3 6 9 5 

EDITAR:

Respuesta con orden descendente:

 arr = df.values arr.sort(axis=0) arr = arr[::-1] print (arr) [[6 9 5] [5 7 4] [3 4 2] [2 1 1]] df1 = pd.DataFrame(arr, index=df.index, columns=df.columns) print (df1) abc 0 6 9 5 1 5 7 4 2 3 4 2 3 2 1 1 

sort_values ordenará todo el dataframe por el orden de las columnas que le pases. En su primer ejemplo, está ordenando todo el dataframe con ['a', 'b', 'c'] . Esto se ordenará primero por 'a' , luego por 'b' y finalmente por 'c' .

Observe cómo, después de clasificar por a , las filas se mantienen igual. Este es el resultado esperado.

Al usar lambda le está pasando cada columna, esto significa que sort_values se aplicará a una sola columna, y es por eso que este segundo enfoque clasifica las columnas como se espera. En este caso, las filas cambian.

Si no quieres usar lambda ni los numpy , puedes usar esto:

 pd.DataFrame({x: df[x].sort_values().values for x in df.columns.values}) 

Salida:

  abc 0 2 1 1 1 3 4 2 2 5 7 4 3 6 9 5