Verwenden Sie die Pandas- idxmax
Funktion. Es ist unkompliziert:
>>> 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
Alternativ können Sie auch Folgendes verwenden numpy.argmax
: numpy.argmax(df['A'])
- Es bietet dasselbe und erscheint mindestens so schnell wie idxmax
bei flüchtigen Beobachtungen.
idxmax()
Gibt Indexbezeichnungen zurück, keine Ganzzahlen.
- Beispiel ': Wenn Sie Zeichenfolgenwerte als Indexbezeichnungen haben, wie z. B. die Zeilen' a 'bis' e ', möchten Sie möglicherweise wissen, dass das Maximum in Zeile 4 auftritt (nicht in Zeile' d ').
- Wenn Sie die ganzzahlige Position dieser Beschriftung innerhalb der möchten
Index
, müssen Sie sie manuell abrufen (was jetzt schwierig sein kann, da doppelte Zeilenbeschriftungen zulässig sind).
HISTORISCHE ANMERKUNGEN:
idxmax()
wurde früher vor 0.11 aufgerufenargmax()
argmax
wurde vor 1.0.0 veraltet und in 1.0.0 vollständig entfernt
- zurück ab Pandas 0.16,
argmax
existierte früher und führte dieselbe Funktion aus (obwohl es langsamer zu laufen schien als idxmax
).
argmax
Die Funktion gab die ganzzahlige Position innerhalb des Index der Zeilenposition des maximalen Elements zurück.
- Pandas verwendeten Zeilenbeschriftungen anstelle von Ganzzahlindizes. Positionszahlige Indizes waren früher sehr häufig, häufiger als Beschriftungen, insbesondere in Anwendungen, in denen doppelte Zeilenbeschriftungen häufig sind.
Betrachten Sie dieses Spielzeug beispielsweise DataFrame
mit einem doppelten Zeilenetikett:
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
Hier reicht also eine naive Verwendung von idxmax
nicht aus, während die alte Form von argmax
die Positionsposition der maximalen Zeile (in diesem Fall Position 9) korrekt angeben würde .
Dies ist genau eine dieser bösen Arten von fehleranfälligen Verhaltensweisen in dynamisch getippten Sprachen, die solche Dinge so unglücklich machen und es wert sind, ein totes Pferd zu schlagen. Wenn Sie Systemcode schreiben und Ihr System plötzlich für einige Datensätze verwendet wird, die vor dem Zusammenfügen nicht ordnungsgemäß bereinigt wurden, kann es sehr leicht zu doppelten Zeilenbeschriftungen kommen, insbesondere zu Zeichenfolgenbeschriftungen wie einer CUSIP- oder SEDOL-Kennung für finanzielle Vermögenswerte. Sie können das Typsystem nicht einfach verwenden, um Ihnen zu helfen, und Sie können möglicherweise die Eindeutigkeit des Index nicht erzwingen, ohne auf unerwartet fehlende Daten zu stoßen.
Sie haben also die Hoffnung, dass Ihre Komponententests alles abdecken (sie haben es nicht getan oder wahrscheinlich hat niemand irgendwelche Tests geschrieben) - ansonsten müssen Sie (höchstwahrscheinlich) nur warten, um zu sehen, ob Sie sich darauf einlassen Fehler zur Laufzeit, in diesem Fall sind Sie wahrscheinlich viele Stunden im wert von Arbeit aus der Datenbank löschen , gehen müssen Sie Ergebnisse wurden zur Ausgabe an, den Kopf gegen die Wand in IPython manuell das Problem zu reproduzieren versuchen , Knall, herauszufinden schließlich heraus , dass es da ist idxmax
kann nur Melden Sie die Bezeichnung der maximalen Zeile und lassen Sie sich dann enttäuschen, dass keine Standardfunktion automatisch die Positionen der maximalen Zeile für Sie abruft. Schreiben Sie selbst eine fehlerhafte Implementierung, bearbeiten Sie den Code und beten Sie, dass Sie nicht erneut auf das Problem stoßen.