Utilisez la idxmax
fonction pandas . C'est simple:
>>> 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
Alternativement, vous pouvez également utiliser numpy.argmax
, comme numpy.argmax(df['A'])
- il fournit la même chose et apparaît au moins aussi vite que idxmax
dans les observations superficielles.
idxmax()
renvoie des étiquettes d'indices, pas des entiers.
- Exemple ': si vous avez des valeurs de chaîne comme étiquettes d'index, comme les lignes' a 'à' e ', vous voudrez peut-être savoir que le maximum se produit dans la ligne 4 (pas la ligne' d ').
- si vous voulez la position entière de cette étiquette dans le,
Index
vous devez l'obtenir manuellement (ce qui peut être délicat maintenant que les étiquettes de ligne en double sont autorisées).
NOTES HISTORIQUES:
idxmax()
était appelé argmax()
avant 0,11
argmax
a été déprécié avant 1.0.0 et supprimé entièrement dans 1.0.0
- de retour à partir de Pandas 0.16,
argmax
existait et remplissait la même fonction (mais semblait fonctionner plus lentement que idxmax
).
argmax
La fonction a renvoyé la position entière dans l'index de l'emplacement de la ligne de l'élément maximum.
- les pandas sont passés à l'utilisation d'étiquettes de lignes au lieu d'indices entiers. Les indices entiers positionnels étaient très courants, plus courants que les étiquettes, en particulier dans les applications où les étiquettes de lignes en double sont courantes.
Par exemple, considérez ce jouet DataFrame
avec une étiquette de ligne en double:
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
Donc, ici, une utilisation naïve de idxmax
ne suffit pas, alors que l'ancienne forme de argmax
fournirait correctement la position emplacement de la ligne max (dans ce cas, la position 9).
C'est exactement l'un de ces types désagréables de comportements sujets aux bogues dans des langages typés dynamiquement qui rendent ce genre de chose si malheureux et qui vaut la peine de battre un cheval mort. Si vous écrivez du code système et que votre système est soudainement utilisé sur certains ensembles de données qui ne sont pas nettoyés correctement avant d'être joints, il est très facile de se retrouver avec des étiquettes de ligne en double, en particulier des étiquettes de chaîne comme un identifiant CUSIP ou SEDOL pour les actifs financiers. Vous ne pouvez pas facilement utiliser le système de type pour vous aider et vous ne pourrez peut-être pas appliquer l'unicité sur l'index sans rencontrer des données manquantes de manière inattendue.
Il vous reste donc à espérer que vos tests unitaires couvrent tout (ils ne l'ont pas fait, ou plus probablement personne n'a écrit de test) - sinon (très probablement) vous êtes juste laissé attendre pour voir si vous vous retrouvez erreur lors de l'exécution, auquel cas vous devrez probablement supprimer de nombreuses heures de travail de la base de données vers laquelle vous produisez les résultats, vous cogner la tête contre le mur dans IPython en essayant de reproduire manuellement le problème, pour finalement comprendre que c'est parce que neidxmax
peut que signaler le libellé de la ligne max, puis être déçu qu'aucune fonction standard n'obtienne automatiquement les positions de la ligne max pour vous, en écrivant vous-même une implémentation de buggy, en éditant le code et en priant pour que vous ne rencontriez plus le problème.