Clasificación por valor absoluto sin cambiar los datos.

Estoy buscando una forma sencilla de ordenar un dataframe de pandas por el valor absoluto de una columna en particular, pero sin cambiar realmente los valores dentro del dataframe. Algo similar a sorted(df, key=abs) . Así que si tuviera un dataframe como:

  ab 0 1 -3 1 2 5 2 3 -1 3 4 2 4 5 -9 

Los datos ordenados resultantes al ordenar en ‘b’ se verían así:

  ab 2 3 -1 3 4 2 0 1 -3 1 2 5 4 5 -9 

ACTUALIZAR

Dado que 0.17.0 order y sort han quedado en desuso (gracias @Ruggero Turra), puede usar sort_values para lograr esto ahora:

 In[16]: df.reindex(df.b.abs().sort_values().index) Out[16]: ab 2 3 -1 3 4 2 0 1 -3 1 2 5 4 5 -9 

En v0.17 +, la sort y el order están en desuso. Un enfoque más limpio sería llamar a Series.argsort en los valores absolutos, y luego indexar:

 df.iloc[df['b'].abs().argsort()] ab 2 3 -1 3 4 2 0 1 -3 1 2 5 4 5 -9 

Si necesita restablecer el índice, use Series.reset_index ,

 df.iloc[df['b'].abs().argsort()].reset_index(drop=True) ab 0 3 -1 1 4 2 2 1 -3 3 2 5 4 5 -9 

Por último, dado que argsort no tiene un parámetro ascending para especificar el orden ascendente / descendente , deberá negar df['b'].abs() para ordenar por orden descendente.

 df.iloc[(-df['b'].abs()).argsort()] ab 4 5 -9 1 2 5 0 1 -3 3 4 2 2 3 -1 

También puede hacer esto con NumPy: use np.abs y ndarray.argsort .

 df.iloc[np.abs(df['b'].values).argsort()] ab 2 3 -1 3 4 2 0 1 -3 1 2 5 4 5 -9 

O, por orden decreciente ,

 df.iloc[(-np.abs(df['b'].values)).argsort()] ab 4 5 -9 1 2 5 0 1 -3 3 4 2 2 3 -1