Python pandas рейтинг по столбцу

s = pd.DataFrame([['2012','A',3],['2012','B',8],['2011','A',20],['2011','B',30]], columns=['Year','Manager','Return'])

Out[1]:     
   Year Manager  Return    
0  2012       A       3    
1  2012       B       8    
2  2011       A      20    
3  2011       B      30

Я хотел бы создать ранг по году. Таким образом, в 2012 году менеджер B - 1. В 2011 году менеджер B снова 1.

Я некоторое время боролся с функцией ранжирования pandas и НЕ хочу прибегать к циклу for.


Проблема, с которой я столкнулся, - это дополнительный код (не думал, что это будет актуально раньше):

s = pd.DataFrame([['2012', 'A', 3], ['2012', 'B', 8], ['2011', 'A', 20], ['2011', 'B', 30]], columns=['Year', 'Manager', 'Return'])
b = pd.DataFrame([['2012', 'A', 3], ['2012', 'B', 8], ['2011', 'A', 20], ['2011', 'B', 30]], columns=['Year', 'Manager', 'Return'])

s= s.append(b)
s['Rank'] = s.groupby(['Year'])['Return'].rank(ascending=False)

raise Exception('Reindexing only valid with uniquely valued Index '
Exception: Reindexing only valid with uniquely valued Index objects

Любые идеи? Это реальная структура данных, которую я использую. Были проблемы с переиндексацией.

Ответ 1

Похоже, вы хотите сгруппировать с помощью Year, затем ранжируйте Returns в порядке убывания:

import pandas as pd
s = pd.DataFrame([['2012', 'A', 3], ['2012', 'B', 8], ['2011', 'A', 20], ['2011', 'B', 30]],
                 columns=['Year', 'Manager', 'Return'])
s['Rank'] = s.groupby(['Year'])['Return'].rank(ascending=False)
print(s)

дает

   Year Manager  Return  Rank
0  2012       A       3     2
1  2012       B       8     1
2  2011       A      20     2
3  2011       B      30     1

Сообщение об ошибке:

ValueError: cannot reindex from a duplicate axis

происходит потому, что в индексе есть повторяющиеся значения. Вы можете избежать проблемы, построив s, чтобы иметь уникальные значения после добавления:

s = s.append(b, ignore_index=True)

дает

In [51]: s
Out[51]: 
   Year Manager  Return
0  2012       A       3
1  2012       B       8
2  2011       A      20
3  2011       B      30
0  2012       A       3
1  2012       B       8
2  2011       A      20
3  2011       B      30

Или, после добавления, s может быть присвоен уникальный индекс, используя reset_index:

s = s.append(b)
s.reset_index(drop=True, inplace=True)