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