2013-07-11 143 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熊猫按列排列

我挣扎着熊猫排名函数一段时间,不想诉诸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

我遇到的问题是与额外的代码(没有认为这将是相关的): – Ben