Возвращает исходное значение 3-х верхних абсолютных значений по строкам pandas?

#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