Grupo de pandas por año, fila por columna de ventas, en un dataframe con datos duplicados

Me gustaría crear un rango en el año (por lo que en el año 2012, el Administrador B es 1. En 2011, el Administrador B es 1 nuevamente). Luché con la función de clasificación de pandas por un tiempo y NO quiero recurrir a un bucle for.

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 

El problema que tengo es con el código adicional (no creía que esto fuera relevante antes):

 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 

¿Algunas ideas?
Esta es la verdadera estructura de datos que estoy usando. He estado teniendo problemas para volver a indexar …

Parece que desea agrupar por Year , luego clasificar los Returns en orden descendente.

 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) 

rendimientos

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

Para abordar la pregunta revisada del OP: El mensaje de error

 ValueError: cannot reindex from a duplicate axis 

ocurre cuando se intenta groupby/rank en un DataFrame con valores duplicados en el índice. Puede evitar el problema construyendo s para tener valores de índice únicos después de agregar:

 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, ignore_index=True) 

rendimientos

  Year Manager Return 0 2012 A 3 1 2012 B 8 2 2011 A 20 3 2011 B 30 4 2012 A 3 5 2012 B 8 6 2011 A 20 7 2011 B 30 

Si ya has agregado nuevas filas usando

 s = s.append(b) 

luego use reset_index para crear un índice único:

 s = s.reset_index(drop=True)