Сортировка по абсолютному значению без изменения данных
Я ищу простой способ сортировки фрейма данных 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