#pandas #numpy
#pandas #numpy
Вопрос:
Я хотел бы вернуть верхние 3 значения после того, как они были отсортированы по их абсолютным значениям. ИТАК, df, подобный этому
0 1 2 3
0 2.822437 1.667583 -1.505558 -0.608644
1 0.357442 1.159013 -1.634652 2.270087
2 1.988308 1.129140 -0.725482 0.049260
Должно вернуть это
0 First Second Third
0 2.82243z 1.667583 -1.505558
1 1.159013 -1.634652 2.270087
2 1.988308 1.129140 -0.725482
Как этого лучше всего достичь? Мне нужно отсортировать их по абсолютному значению, но мне нужно вернуть исходное значение.
Спасибо
Ответ №1:
Не уверен, что это то, что вам нужно; это использует numpy для выполнения большей части работы перед перестройкой фрейма данных :
array = df.to_numpy()
# gets the absolute value
# then gets the indices that would sort the array
# since just the top three is needed and the max
# we drop the first column and flip the rows
positions = np.argsort(np.abs(array), axis=1)[::-1, 1:]
new_array = np.take_along_axis(array, positions, axis=1)[:, ::-1]
new_array = pd.DataFrame(new_array, columns=["First", "Second", "Third"])
new_array
First Second Third
0 2.822437 1.667583 -1.505558
1 2.270087 -1.634652 1.159013
2 1.988308 1.129140 -0.725482
Ответ №2:
Вот один из способов
out = pd.DataFrame(df.apply(lambda x : sorted(x,key=abs)[1:][::-1],1).tolist())
Out[16]:
0 1 2
0 2.822437 1.667583 -1.505558
1 2.270087 -1.634652 1.159013
2 1.988308 1.129140 -0.725482