2013-07-11 142 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