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

Vorrei creare un grado per anno. Quindi, nel 2012, Manager B è 1. Nel 2011, Manager B è di nuovo 1.python panda rank per colonna

Ho lottato con la funzione di classificazione dei panda per un po 'e NON voglio ricorrere ad un ciclo for.


Il problema che sto avendo è con il codice addizionale (non ha ancora pensare che questo sarebbe rilevante prima):

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 

Tutte le idee?
Questa è la vera struttura dati che sto usando. avuto problemi reindicizzazione ..

risposta

19

Sembra che si desidera raggruppare dal Year, quindi classificare l'Returns in ordine decrescente:

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) 

rendimenti

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

Il messaggio di errore:

ValueError: cannot reindex from a duplicate axis 

si verifica perché nell'indice esistono valori duplicati. È possibile evitare il problema costruendo s avere valori univoci dopo aggiungendo:

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

cede

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 

Oppure, dopo aggiungendo, s potrebbe essere dato un indice univoco utilizzando reset_index:

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

@ user2514296 questo sembra giusto, non è sicuro che cosa pensi sia "off" ... –

+0

Il problema che sto avendo è con il codice aggiuntivo (didnt penso che questo sarebbe rilevante prima): – Ben