Usa la idxmax
funzione Panda . È semplice:
>>> 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
In alternativa puoi anche usare numpy.argmax
, come numpy.argmax(df['A'])
- fornisce la stessa cosa, e appare veloce almeno quanto idxmax
nelle osservazioni superficiali.
idxmax()
restituisce etichette di indici, non numeri interi.
- Esempio ': se hai valori di stringa come etichette di indice, come le righe da' a 'a' e ', potresti voler sapere che il massimo si verifica nella riga 4 (non nella riga' d ').
- se vuoi la posizione intera di quella etichetta all'interno di quella
Index
devi ottenerla manualmente (il che può essere complicato ora che sono consentite etichette di riga duplicate).
NOTE STORICHE:
idxmax()
era chiamato argmax()
prima di 0.11
argmax
è stato deprecato prima della 1.0.0 e rimosso completamente nella 1.0.0
- a partire da Panda 0.16,
argmax
esisteva ed eseguiva la stessa funzione (anche se sembrava funzionare più lentamente di idxmax
).
argmax
La funzione ha restituito la posizione intera all'interno dell'indice della posizione della riga dell'elemento massimo.
- i panda sono passati all'utilizzo di etichette di riga anziché di indici interi. Gli indici interi posizionali erano molto comuni, più comuni delle etichette, specialmente nelle applicazioni in cui sono comuni etichette di riga duplicate.
Ad esempio, considera questo giocattolo DataFrame
con un'etichetta di riga duplicata:
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
Quindi qui un ingenuo uso di idxmax
non è sufficiente, mentre la vecchia forma di argmax
fornirebbe correttamente la posizione posizionale della riga massima (in questo caso, posizione 9).
Questo è esattamente uno di quei cattivi tipi di comportamenti inclini ai bug in linguaggi tipicamente dinamici che rendono questo tipo di cose così sfortunate e che vale la pena battere un cavallo morto. Se stai scrivendo codice di sistema e il tuo sistema viene improvvisamente utilizzato su alcuni set di dati che non vengono puliti correttamente prima di essere uniti, è molto facile finire con etichette di riga duplicate, in particolare etichette di stringa come un identificatore CUSIP o SEDOL per attività finanziarie. Non è possibile utilizzare facilmente il sistema dei tipi per aiutarti e potresti non essere in grado di applicare l'univocità sull'indice senza incorrere in dati inaspettatamente mancanti.
Quindi rimani con la speranza che i tuoi test unitari coprano tutto (non lo hanno fatto, o più probabilmente nessuno ha scritto alcun test) - altrimenti (molto probabilmente) rimani solo in attesa di vedere se ti capita di entrare in questo errore in fase di esecuzione, nel qual caso probabilmente si deve andare cadere numero di ore vale la pena di lavoro dal database si erano l'output risultati, sbattere la testa contro il muro in IPython cercando di riprodurre manualmente il problema, finalmente capire che è perché idxmax
può solo segnala l' etichetta della riga massima, e poi rimarrai deluso dal fatto che nessuna funzione standard ottiene automaticamente le posizioni della riga massima per te, scrivendo tu stesso un'implementazione con errori, modificando il codice e pregando di non incorrere nuovamente nel problema.