ti-enxame.com

pandas agrupa por ano, classifica por coluna de vendas, em um quadro de dados com dados duplicados

Gostaria de criar uma classificação no ano (portanto, no ano de 2012, o Gerente B é 1. Em 2011, o Gerente B é 1 novamente). Eu lutei com a função de classificação pandas por um tempo e NÃO quero recorrer a um loop 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

O problema que estou tendo é com o código adicional (não achei que isso fosse 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

Alguma ideia?
Essa é a estrutura de dados real que estou usando. Está tendo problemas para re-indexar ..

17
Ben

Parece que você deseja agrupar por Year e, em seguida, classifique Returns em ordem 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)

rendimentos

   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 resolver a pergunta revisada do OP: A mensagem de erro

ValueError: cannot reindex from a duplicate axis

ocorre ao tentar groupby/rank em um DataFrame com valores duplicados no índice. Você pode evitar o problema construindo s para ter valores de índice exclusivos após anexar:

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)

rendimentos

   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

Se você já adicionou novas linhas usando

s = s.append(b)

então use reset_index para criar um índice exclusivo:

s = s.reset_index(drop=True)
26
unutbu