Группировка по столбцу, сортировка другого столбца и присвоение ранга строкам в python

#python #sorting #group-by

#python #сортировка #группировка по

Вопрос:

У меня есть следующие оценки фрейма данных в pandas.

 identifier  name             score
D29650  abc10   115369-52-3  0.75
D29650  abc10   115369-52-4  0.34
D29651  abc11   115369-52-5  0.25
D29651  abc11   ls-132190    0.67
D29652  abc12   me1228           1.0
D29652  abc12   me 1228          0.875
  

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

 score_new=scores.groupby(['identifier'],as_index=False).apply(lambda x:x.sort_values(by='score',ascending=False)).reset_index(drop=True)
  

Желаемый результат:

 identifier  name             score  rank
D29650  abc10   115369-52-3  0.75   1
D29650  abc10   115369-52-4  0.34   2
D29651  abc11   ls-132190    0.67   1
D29651  abc11   115369-52-5  0.25   2 
D29652  abc12   me1228           1.0    1
D29652  abc12   me 1228          0.875  2
  

Любая помощь здесь высоко ценится

Ответ №1:

Используйте:

 df['rank']=df.groupby('identifier')['score'].rank(ascending=False).astype('int32')
  

Комментарии:

1. Можем ли мы получить ранг в абсолютном числе? На данный момент это десятичные дроби. Спасибо

2. Вы можете сделать это, используя понимание списка: df[‘rank’] = [int(i) для i в df.groupby(«идентификатор»)[‘оценка’].ранг(по возрастанию = False) ]

3. Приведенный выше ответ работает хорошо, как я могу отсортировать ранг..

4. @rshar , добавил .astype(‘int32’) для приведения столбца ранга, посмотрим, поможет ли это

Ответ №2:

Попробуйте это?

 df1=df1.sort_values(['Identifier'],ascending=[True,True])
df1['Score']=df1.Name!=df1.Name.shift().fillna('edit')
df1.Score=df1.groupby('ID').Score.cumsum() 1