Utiliza la idxmax
función de pandas . Es sencillo:
>>> 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
Alternativamente, también podría usar numpy.argmax
, como numpy.argmax(df['A'])
: proporciona lo mismo y aparece al menos tan rápido como idxmax
en las observaciones superficiales.
idxmax()
devuelve etiquetas de índices, no enteros.
- Ejemplo ': si tiene valores de cadena como etiquetas de índice, como las filas' a 'a' e ', es posible que desee saber que el máximo se produce en la fila 4 (no en la fila' d ').
- si desea la posición entera de esa etiqueta dentro de la
Index
, debe obtenerla manualmente (lo cual puede ser complicado ahora que se permiten etiquetas de fila duplicadas).
NOTAS HISTORICAS
idxmax()
solía llamarse argmax()
antes de 0.11
argmax
fue desaprobado antes de 1.0.0 y eliminado por completo en 1.0.0
- desde Pandas 0.16,
argmax
solía existir y realizar la misma función (aunque parecía funcionar más lentamente que idxmax
).
argmax
La función devolvió la posición entera dentro del índice de la ubicación de la fila del elemento máximo.
- los pandas se movieron al uso de etiquetas de fila en lugar de índices enteros. Los índices enteros posicionales solían ser muy comunes, más comunes que las etiquetas, especialmente en aplicaciones donde las etiquetas de fila duplicadas son comunes.
Por ejemplo, considere este juguete DataFrame
con una etiqueta de fila duplicada:
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
Por lo tanto, aquí un uso ingenuo de idxmax
no es suficiente, mientras que la forma anterior de argmax
proporcionaría correctamente la ubicación posicional de la fila máxima (en este caso, la posición 9).
Este es exactamente uno de esos tipos desagradables de comportamientos propensos a errores en lenguajes escritos dinámicamente que hacen que este tipo de cosas sea tan desafortunado y que valga la pena vencer a un caballo muerto. Si está escribiendo código de sistemas y su sistema de repente se usa en algunos conjuntos de datos que no se limpian correctamente antes de unirse, es muy fácil terminar con etiquetas de fila duplicadas, especialmente etiquetas de cadena como un identificador CUSIP o SEDOL para activos financieros. No puede usar fácilmente el sistema de tipos para ayudarlo, y es posible que no pueda imponer la unicidad en el índice sin encontrarse con datos que faltan inesperadamente.
Entonces, te queda la esperanza de que tus pruebas unitarias cubran todo (no lo hicieron, o más probablemente nadie escribió ninguna prueba); de lo contrario (muy probablemente) solo te quedará esperando para ver si te topas con esto error en el tiempo de ejecución, en cuyo caso es probable que deba soltar muchas horas de trabajo de la base de datos a la que estaba enviando resultados, golpearse la cabeza contra la pared en IPython tratando de reproducir el problema manualmente, finalmente descubriendo que es porque soloidxmax
puede informe la etiqueta de la fila máxima, y luego se decepcionará de que ninguna función estándar obtenga automáticamente las posiciones de la fila máxima para usted, escribiendo una implementación con errores usted mismo, editando el código y rezando para que no vuelva a encontrarse con el problema.