Use a idxmax
função pandas . É simples:
>>> import pandas
>>> import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])
>>> df
A B C
0 1.232853 -1.979459 -0.573626
1 0.140767 0.394940 1.068890
2 0.742023 1.343977 -0.579745
3 2.125299 -0.649328 -0.211692
4 -0.187253 1.908618 -1.862934
>>> df['A'].argmax()
3
>>> df['B'].argmax()
4
>>> df['C'].argmax()
1
Como alternativa, você também pode usar numpy.argmax
, como numpy.argmax(df['A'])
- ele fornece a mesma coisa e aparece pelo menos tão rápido quanto idxmax
em observações superficiais.
idxmax()
retorna rótulos de índices, não números inteiros.
- Exemplo ': se você tiver valores de sequência como seus rótulos de índice, como as linhas' a 'a' e ', convém saber que o máximo ocorre na linha 4 (não na linha' d ').
- se você quiser a posição inteira desse rótulo dentro da etiqueta,
Index
precisará obtê-lo manualmente (o que pode ser complicado agora que rótulos de linha duplicados são permitidos).
NOTAS HISTÓRICAS:
idxmax()
costumava ser chamado argmax()
antes de 0.11
argmax
foi preterido antes da 1.0.0 e removido inteiramente na 1.0.0
- de volta ao Pandas 0.16,
argmax
existia e desempenhava a mesma função (embora parecesse rodar mais lentamente que idxmax
).
argmax
A função retornou a posição inteira no índice do local da linha do elemento máximo.
- os pandas passaram a usar rótulos de linha em vez de índices inteiros. Os índices inteiros posicionais costumavam ser muito comuns, mais comuns que os rótulos, especialmente em aplicativos onde rótulos de linha duplicados são comuns.
Por exemplo, considere este brinquedo DataFrame
com um rótulo de linha duplicado:
In [19]: dfrm
Out[19]:
A B C
a 0.143693 0.653810 0.586007
b 0.623582 0.312903 0.919076
c 0.165438 0.889809 0.000967
d 0.308245 0.787776 0.571195
e 0.870068 0.935626 0.606911
f 0.037602 0.855193 0.728495
g 0.605366 0.338105 0.696460
h 0.000000 0.090814 0.963927
i 0.688343 0.188468 0.352213
i 0.879000 0.105039 0.900260
In [20]: dfrm['A'].idxmax()
Out[20]: 'i'
In [21]: dfrm.iloc[dfrm['A'].idxmax()] # .ix instead of .iloc in older versions of pandas
Out[21]:
A B C
i 0.688343 0.188468 0.352213
i 0.879000 0.105039 0.900260
Portanto, aqui um uso ingênuo de idxmax
não é suficiente, enquanto a forma antiga de argmax
forneceria corretamente a localização posicional da linha máxima (neste caso, posição 9).
Esse é exatamente um daqueles tipos desagradáveis de comportamentos propensos a erros em linguagens dinamicamente tipadas que tornam esse tipo de coisa tão infeliz e que vale a pena bater em um cavalo morto. Se você estiver gravando código do sistema e seu sistema for subitamente usado em alguns conjuntos de dados que não são limpos corretamente antes de ingressar, é muito fácil acabar com rótulos de linha duplicados, especialmente rótulos de string, como um identificador CUSIP ou SEDOL para ativos financeiros. Você não pode usar facilmente o sistema de tipos para ajudá-lo e talvez não consiga impor exclusividade no índice sem encontrar dados inesperadamente ausentes.
Portanto, você tem a esperança de que seus testes de unidade abranjam tudo (eles não o fizeram, ou mais provavelmente ninguém escreveu nenhum teste) - caso contrário (provavelmente), você ficará esperando para ver se está de acordo com isso. erro em tempo de execução; nesse caso, você provavelmente precisará gastar muitas horas de trabalho no banco de dados para o qual estava produzindo resultados, bater a cabeça contra a parede no IPython, tentando reproduzir manualmente o problema, finalmente descobrindo que é porque sóidxmax
pode reporte o rótulo da linha máxima e, em seguida, desapontado por nenhuma função padrão obter automaticamente as posições da linha máxima para você, escrevendo você mesmo uma implementação de buggy, editando o código e rezando para que você não tenha problemas novamente.