2013-07-11 3 views
12
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.python pandas rank by column

Я некоторое время боролся с функцией ранжирования панд и НЕ хочу прибегать к циклу 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 

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

ответ

19

Это звучит, как вы хотите сгруппировать по 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) 
+0

@ user2514296 это выглядит правильно, не уверен, что вы думаете «выключено» ... –

+0

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