>>>import pandas
>>>import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])>>> df
A B C
01.232853-1.979459-0.57362610.1407670.3949401.06889020.7420231.343977-0.57974532.125299-0.649328-0.2116924-0.1872531.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 idxmaxen 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).
desde Pandas 0.16, argmaxsolía existir y realizar la misma función (aunque parecía funcionar más lentamente que idxmax).
argmaxLa 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 DataFramecon una etiqueta de fila duplicada:
In[19]: dfrm
Out[19]:
A B C
a 0.1436930.6538100.586007
b 0.6235820.3129030.919076
c 0.1654380.8898090.000967
d 0.3082450.7877760.571195
e 0.8700680.9356260.606911
f 0.0376020.8551930.728495
g 0.6053660.3381050.696460
h 0.0000000.0908140.963927
i 0.6883430.1884680.352213
i 0.8790000.1050390.900260In[20]: dfrm['A'].idxmax()Out[20]:'i'In[21]: dfrm.iloc[dfrm['A'].idxmax()]# .ix instead of .iloc in older versions of pandasOut[21]:
A B C
i 0.6883430.1884680.352213
i 0.8790000.1050390.900260
Por lo tanto, aquí un uso ingenuo de idxmaxno es suficiente, mientras que la forma anterior de argmaxproporcionarí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.
Basado en el penúltimo comentario allí, parece argminy argmaxseguirá siendo parte DataFramey la diferencia es solo si desea el índice o la etiqueta. idxmaxle dará la etiqueta de la ubicación donde se produce un máximo. argmaxle dará el índice entero en sí.
ely
44
¡La información provista para explicar la diferencia entre argmaxy idxmax, y cómo evitar errores con índice duplicado fue excelente! No lo noté hasta que leí tu comentario en la otra respuesta. ¡Gracias!
tupan
Con respecto al uso que le gustaría implementar, Pandas 0.24.1 señala lo siguiente: 'el comportamiento de argmaxse corregirá para devolver el máximo posicional en el futuro. Por ahora, use series.values.argmaxo np.argmax(np.array(values))para obtener la posición de la fila máxima.
Sam
1
de manera similar, el .ixmétodo del segundo ejemplo ha cambiado de nombre.iloc
Ma0
si su columna contiene solo valores nan, esto dará como resultado TypeError
Max Segal
77
También puedes probar idxmax:
In[5]: df = pandas.DataFrame(np.random.randn(10,3),columns=['A','B','C'])In[6]: df
Out[6]:
A B C
02.0012890.4825611.5799851-0.991646-0.3878351.32023620.143826-1.0968891.4865083-0.193056-0.4990201.5365404-2.083647-3.0745910.1757725-0.186138-1.9497310.2874326-0.480790-1.771560-0.93023470.227383-0.2782532.1020048-0.0025921.434192-1.62491590.404911-2.167599-0.452900In[7]: df.idxmax()Out[7]:
A 0
B 8
C 7
p.ej
In[8]: df.loc[df['A'].idxmax()]Out[8]:
A 2.001289
B 0.482561
C 1.579985
df.ix[df['A'].idxmax()].valuespara agarrar la matriz que quería. todavía funciona.
Yojimbo
2
Tenga en cuenta que debe tener cuidado al tratar de utilizar la salida de idxmaxun alimentador ixo loccomo un medio para dividir los datos y / o para obtener la ubicación posicional de la fila máxima. Debido a que puede tener duplicados en Index- vea la actualización de mi respuesta para ver un ejemplo.
ely
25
Ambas respuestas anteriores solo devolverían un índice si hay varias filas que toman el valor máximo. Si desea todas las filas, no parece tener una función. Pero no es difícil de hacer. A continuación se muestra un ejemplo de Serie; Lo mismo puede hacerse para DataFrame:
In[1]:from pandas importSeries,DataFrameIn[2]: s=Series([2,4,4,3],index=['a','b','c','d'])In[3]: s.idxmax()Out[3]:'b'In[4]: s[s==s.max()]Out[4]:
b 4
c 4
dtype: int64
¡Gracias! versión para DataFrame:df[df['A'] == df['A'].max()]
Dennis Golomazov
Esta es la respuesta correcta (la versión DataFrame).
Gented
12
df.iloc[df['columnX'].argmax()]
argmax()proporcionaría el índice correspondiente al valor máximo para la columnaX. ilocse puede usar para obtener la fila del DataFrame df para este índice.
>>>import pandas
>>>import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])>>> df
A B C
01.232853-1.979459-0.57362610.1407670.3949401.06889020.7420231.343977-0.57974532.125299-0.649328-0.2116924-0.1872531.908618-1.862934>>> df['A'].argmax()3>>> df['B'].argmax()4>>> df['C'].argmax()1
devuelve el siguiente mensaje:
FutureWarning:'argmax'is deprecated, use 'idxmax' instead.The behavior of 'argmax'
will be corrected to return the positional maximum in the future.Use'series.values.argmax' to get the position of the maximum now.
Esta línea de código le dará cómo encontrar el valor máximo de una fila en el marco de datos, aquí mxestá el marco de datos e iloc[0]indica el índice 0.
El idmaxdel DataFrame devuelve el índice de etiqueta de la fila con el valor máximo y el comportamiento de argmaxdepende de la versión de pandas(en este momento devuelve una advertencia). Si desea utilizar el índice posicional , puede hacer lo siguiente:
max_row = df['A'].values.argmax()
o
import numpy as np
max_row = np.argmax(df['A'].values)
Tenga en cuenta que si usa se np.argmax(df['A'])comporta igual que df['A'].argmax().
sort_valuesy obtener el índice:df.sort_values('col', ascending=False)[:2].indexRespuestas:
Utiliza la
idxmaxfunción de pandas . Es sencillo:Alternativamente, también podría usar
numpy.argmax, comonumpy.argmax(df['A']): proporciona lo mismo y aparece al menos tan rápido comoidxmaxen las observaciones superficiales.idxmax()devuelve etiquetas de índices, no enteros.Index, debe obtenerla manualmente (lo cual puede ser complicado ahora que se permiten etiquetas de fila duplicadas).NOTAS HISTORICAS
idxmax()solía llamarseargmax()antes de 0.11argmaxfue desaprobado antes de 1.0.0 y eliminado por completo en 1.0.0argmaxsolía existir y realizar la misma función (aunque parecía funcionar más lentamente queidxmax).argmaxLa función devolvió la posición entera dentro del índice de la ubicación de la fila del elemento máximo.Por ejemplo, considere este juguete
DataFramecon una etiqueta de fila duplicada:Por lo tanto, aquí un uso ingenuo de
idxmaxno es suficiente, mientras que la forma anterior deargmaxproporcionarí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 solo
idxmaxpuede 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.fuente
argminyargmaxseguirá siendo parteDataFramey la diferencia es solo si desea el índice o la etiqueta.idxmaxle dará la etiqueta de la ubicación donde se produce un máximo.argmaxle dará el índice entero en sí.argmaxyidxmax, y cómo evitar errores con índice duplicado fue excelente! No lo noté hasta que leí tu comentario en la otra respuesta. ¡Gracias!argmaxse corregirá para devolver el máximo posicional en el futuro. Por ahora, useseries.values.argmaxonp.argmax(np.array(values))para obtener la posición de la fila máxima..ixmétodo del segundo ejemplo ha cambiado de nombre.ilocTambién puedes probar
idxmax:p.ej
fuente
df.ix[df['A'].idxmax()].valuespara agarrar la matriz que quería. todavía funciona.idxmaxun alimentadorixoloccomo un medio para dividir los datos y / o para obtener la ubicación posicional de la fila máxima. Debido a que puede tener duplicados enIndex- vea la actualización de mi respuesta para ver un ejemplo.Ambas respuestas anteriores solo devolverían un índice si hay varias filas que toman el valor máximo. Si desea todas las filas, no parece tener una función. Pero no es difícil de hacer. A continuación se muestra un ejemplo de Serie; Lo mismo puede hacerse para DataFrame:
fuente
df[df['A'] == df['A'].max()]argmax()proporcionaría el índice correspondiente al valor máximo para la columnaX.ilocse puede usar para obtener la fila del DataFrame df para este índice.fuente
La solución directa ".argmax ()" no funciona para mí.
El ejemplo anterior proporcionado por @ely
devuelve el siguiente mensaje:
Para que mi solución sea:
fuente
Esta línea de código le dará cómo encontrar el valor máximo de una fila en el marco de datos, aquí
mxestá el marco de datos eiloc[0]indica el índice 0.fuente
El
idmaxdel DataFrame devuelve el índice de etiqueta de la fila con el valor máximo y el comportamiento deargmaxdepende de la versión depandas(en este momento devuelve una advertencia). Si desea utilizar el índice posicional , puede hacer lo siguiente:o
Tenga en cuenta que si usa se
np.argmax(df['A'])comporta igual quedf['A'].argmax().fuente