Вернуть верхние 2 и нижние 1 столбцы ранжированного кадра данных pandas - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь возвратить по строкам две верхние записи по значению и нижнюю запись по значению в виде дополнительных столбцов или отдельного фрейма данных (либо, либо).

Допустим, у меня есть следующий массив данных значений:

example = pd.DataFrame({'a':[3, 8, 5, 3, 2, 1, 3],
                        'b':[6, 5, 8, 0, 3, 2, 1], 
                        'c':[1, 4, 5, 3, 6, 2, 7],
                        'd':[4, 6, 5, 3, 9, 11, 3],
                        'e':[8, 0, 5, 2, 1, 1, 3]})
example

   a  b  c   d  e
0  3  6  1   4  8
1  8  5  4   6  0
2  5  8  5   5  5
3  3  0  3   3  2
4  2  3  6   9  1
5  1  2  2  11  1
6  3  1  7   3  3

Так как я хочу найти верхние значения, я в конечном итоге ранжирую этот кадр данных по столбцам без повторения по рангу.

rank_df = example.rank(axis=1, method='first', ascending=False)
rank_df

     a    b    c    d    e
0  4.0  2.0  5.0  3.0  1.0
1  1.0  3.0  4.0  2.0  5.0
2  2.0  1.0  3.0  4.0  5.0
3  1.0  5.0  2.0  3.0  4.0
4  4.0  3.0  2.0  1.0  5.0
5  4.0  2.0  3.0  1.0  5.0
6  2.0  5.0  1.0  3.0  4.0

Теперь, наконец, я хотел бы получить имена столбцов для рангов и вытащить в фрейм данных два верхних и нижний. Например, строка 0 имеет ранг 1 в столбце e, ранг 2 в столбце b и ранг 5 в столбце c, поэтому тремя столбцами будут e, b, c.

Ожидаемый результат:

   top_1, top_2, bottom_1
0  e      b      c
1  a      d      e
2  b      a      e
3  a      c      b
4  d      c      e
5  d      b      e
6  c      a      b

1 Ответ

1 голос
/ 20 февраля 2020

Используйте numpy.argsort для позиций отсортированных значений и получения имен столбцов путем индексации:

a = example.columns.to_numpy()[(-example).to_numpy().argsort()]
#if use lower version of pandas
#a = example.columns.values[(-example).values.argsort()]
print(a)

[['e' 'b' 'd' 'a' 'c']
 ['a' 'd' 'b' 'c' 'e']
 ['b' 'a' 'c' 'd' 'e']
 ['a' 'c' 'd' 'e' 'b']
 ['d' 'c' 'b' 'a' 'e']
 ['d' 'b' 'c' 'a' 'e']
 ['c' 'a' 'd' 'e' 'b']]

А затем выберите первый, второй и последний столбец и преобразуйте их в DataFrame:

df = pd.DataFrame(a[:, [0,1,-1]], index=df.index, columns=['top_1', 'top_2', 'bottom_1'])
print (df)
  top_1 top_2 bottom_1
0     e     b        c
1     a     d        e
2     b     a        e
3     a     c        b
4     d     c        e
5     d     b        e
6     c     a        b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...