Упорядочить / отсортировать данные в данных фрейма панды на основе столбца - PullRequest
1 голос
/ 24 мая 2019

Я новичок в Пандах. Мне нужно отсортировать и сгруппировать значения данных в порядке убывания на основе циклического порядка внутри групп. У меня есть следующий датафрейм:

Col1 Col2  
A     5030 
B     4250
c     3340
D     2100
A     5044
B     4790
C     3482
C     3233
A      5099
B      4820
D      2345
D      2784
A      5999

Мне нужно отсортировать фрейм данных так, чтобы все значения в Col2 располагались в пределах Col1 в циклическом порядке, начиная с наивысшего и наименьшего. Например, сначала будут упорядочены все наивысшие значения (A, B, C, D), а затем последуют вторые наивысшие значения (A, B, C, D) и затем 3-е наивысшие значения (A, B, C, D) группа должна следовать и т. Д.

Конечный фрейм данных должен выглядеть следующим образом после сортировки:

Col1     Col2

A         5999
B         4820
C         3482
D         2784
A         5099
B         4790
C         3340
D         2345
A         5044
B         4250
C         3233
D         2100
A         5030

Col1 не будет иметь никаких других значений, кроме (A, B, C, D). Но могут быть сценарии, когда в Col1 присутствуют только 2 или 3 различных значения. Таким образом, логика должна быть сделана соответственно.

Я мог бы решить проблему, выполнив следующие шаги:

  1. Создание отдельных кадров данных на основе различных значений в Col1.
  2. Упорядочивание и индексация каждого из подкадров в порядке убывания на основе значений в Col2.
  3. Затем перебираем индексы субкадра и добавляем данные в новый кадр данных с каждого отдельного субкадра.

Этот процесс не кажется лучшим подходом. Поэтому я ищу предложения для более простого нативного решения.

1 Ответ

3 голосов
/ 24 мая 2019

IIUC создайте новый ключ, используя cumcount

df['Key']=df.sort_values('Col2',ascending=False).groupby('Col1').cumcount()
df=df.sort_values(['Key','Col1']).drop('Key',1)
df
Out[453]: 
   Col1  Col2
12    A  5999
9     B  4820
6     C  3482
11    D  2784
8     A  5099
5     B  4790
2     C  3340
10    D  2345
4     A  5044
1     B  4250
7     C  3233
3     D  2100
0     A  5030
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...