Рейтинг без дубликатов - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь ранжировать большой набор данных с помощью python. Мне не нужны дубликаты, и вместо использования «первого» метода я хотел бы, чтобы он смотрел на другой столбец и ранжировал его на основе этого значения.

Второй столбец следует рассматривать только в том случае, если ранг в первом столбце имеет дубликаты.

Name   CountA CountB
Alpha  15     3
Beta   20     52
Delta  20     31
Gamma  45     43

Я бы хотел, чтобы рейтинг завершился

Name   CountA CountB Rank
Alpha  15     3      4
Beta   20     52     2
Delta  20     31     3
Gamma  45     43     1

В настоящее время я использую df.rank(ascending=False, method='first')

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Может использовать sort и вытащить индекс:

import pandas as pd
df = pd.DataFrame({'Name':['A','B','C','D'],'CountA':[15,20,20,45],'CountB':[3,52,31,43]}) 
df['rank'] = df.sort_values(['CountA','CountB'],ascending=False).index + 1 

  Name  CountA  CountB  rank
0    A      15       3     4
1    B      20      52     2
2    C      20      31     3
3    D      45      43     1
0 голосов
/ 19 июня 2020

Вы можете подсчитать значения в CountA, а затем отфильтровать строки DataFrame на основе количества CountA, превышающего 1. Если значение count больше 1, возьмите CountB, иначе CountA.

df = pd.DataFrame([[15,3],[20,52],[20,31],[45,43]],columns=['CountA','CountB'])

colAcount = df['CountA'].value_counts()

#then take the indices where colACount > 1 and use them in a where

df['final'] = df['CountA'].where(~df['CountA'].isin(colAcount[colAcount>1].index),df['CountB'])

df = df.sort_values(by='final', ascending=False).reset_index(drop=True)

# the rank is the index
   CountA  CountB  final
0      20      52     52
1      45      43     45
2      20      31     31
3      15       3     15

Подробнее см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...