Сортировка по абсолютному значению без изменения данных

Я ищу простой способ сортировки фрейма данных pandas по абсолютному значению конкретного столбца, но без фактического изменения значений в фреймворке данных. Что-то похожее на sorted(df, key=abs). Поэтому, если бы у меня был такой кадр данных:

    a   b
0   1   -3
1   2   5 
2   3   -1
3   4   2
4   5   -9

Полученные отсортированные данные при сортировке по 'b' будут выглядеть так:

    a   b
2   3   -1
3   4   2
0   1   -3
1   2   5 
4   5   -9

Ответ 1

ОБНОВИТЬ

Поскольку order и sort 0.17.0 устарели (спасибо @Ruggero Turra), вы можете использовать sort_values чтобы добиться этого сейчас:

In[16]:

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

Ответ 2

В v0. 17+ sort и order устарели. Более чистым подходом было бы вызвать Series.argsort для абсолютных значений, а затем индексировать:

df.iloc[df['b'].abs().argsort()]

   a  b
2  3 -1
3  4  2
0  1 -3
1  2  5
4  5 -9

Если вам нужно сбросить индекс, используйте Series.reset_index,

df.iloc[df['b'].abs().argsort()].reset_index(drop=True)

   a  b
0  3 -1
1  4  2
2  1 -3
3  2  5
4  5 -9

Наконец, поскольку argsort не имеет ascending параметра для указания возрастающего/убывающего порядка, вам нужно будет отрицать df['b'].abs() для сортировки по убыванию.

df.iloc[(-df['b'].abs()).argsort()]

   a  b
4  5 -9
1  2  5
0  1 -3
3  4  2
2  3 -1

Вы можете сделать это и с NumPy - используйте np.abs и ndarray.argsort.

df.iloc[np.abs(df['b'].values).argsort()]

   a  b
2  3 -1
3  4  2
0  1 -3
1  2  5
4  5 -9

Или, по убыванию,

df.iloc[(-np.abs(df['b'].values)).argsort()]

   a  b
4  5 -9
1  2  5
0  1 -3
3  4  2
2  3 -1