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

Ich möchte einen Rang auf Jahr erstellen. Manager B ist also im Jahr 2012 1. 2011 ist Manager B wieder 1.Python Pandas Rang nach Spalte

Ich habe eine Weile mit der Pandas Rank-Funktion gekämpft und möchte NICHT auf eine for-Schleife zurückgreifen.


Das Problem habe ich mit dem zusätzlichen Code habe, ist (nicht glaube, dies vor relevant wäre):

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 

Irgendwelche Ideen?
Dies ist die reale Datenstruktur, die ich verwende. worden Probleme beim Neuindexierung ..

Antwort

19

Es klingt wie Sie durch die Year gruppieren möchten, dann zählen die Returns in absteigender Reihenfolge:

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) 

Ausbeuten

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

Die Fehlermeldung:

ValueError: cannot reindex from a duplicate axis 

tritt auf, weil doppelte Werte im Index vorhanden sind. Sie können das Problem vermeiden s durch den Bau eindeutige Werte zu haben, nachdem anhängt:

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 

ergibt Oder nach Anfügen s einen eindeutigen Index gegeben werden könnte mit reset_index:

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

@ user2514296 das sieht richtig aus, nicht sicher, was Sie denken, ist "aus" ... –

+0

Das Problem, das ich habe, ist mit dem zusätzlichen Code (didnt denke, das wäre vorher relevant): – Ben

Verwandte Themen