Encuentre el valor máximo de una columna y devuelva los valores de fila correspondientes usando Pandas


117

Estructura de datos;

Usando Python Pandas, estoy tratando de encontrar el Country& Placecon el valor máximo.

Esto devuelve el valor máximo:

data.groupby(['Country','Place'])['Value'].max()

Pero, ¿cómo puedo obtener el correspondiente Countryy el Placenombre?

Respuestas:


170

Suponiendo que dftiene un índice único, esto da la fila con el valor máximo:

In [34]: df.loc[df['Value'].idxmax()]
Out[34]: 
Country        US
Place      Kansas
Value         894
Name: 7

Tenga en cuenta que idxmaxdevuelve etiquetas de índice . Entonces, si el DataFrame tiene duplicados en el índice, es posible que la etiqueta no identifique de manera única la fila, por lo que df.locpuede devolver más de una fila.

Por lo tanto, si dfno tiene un índice único, debe hacer que el índice sea único antes de proceder como se indicó anteriormente. Dependiendo del DataFrame, a veces puede usar stacko set_indexpara hacer que el índice sea único. O simplemente puede restablecer el índice (para que las filas se vuelvan a numerar, comenzando en 0):

df = df.reset_index()

Gracias. Eso era exactamente lo que estaba buscando.
richie

56
df[df['Value']==df['Value'].max()]

Esto devolverá la fila completa con el valor máximo


Explicación: - La expresión interna realiza una verificación booleana a lo largo de la longitud del dataFrame y ese índice que satisface el lado derecho de la expresión (.max ()) devuelve el índice, que a su vez llama a la fila completa de ese dataFrame
penta

10

El país y el lugar es el índice de la serie, si no necesita el índice, puede establecer as_index=False:

df.groupby(['country','place'], as_index=False)['value'].max()

Editar:

Parece que desea el lugar con el valor máximo para cada país, el siguiente código hará lo que desee:

df.groupby("country").apply(lambda df:df.irow(df.value.argmax()))

que solo devolvería los nombres de columna y los dtypes
richie

8

Creo que la forma más fácil de devolver una fila con el valor máximo es obteniendo su índice. argmax()se puede utilizar para devolver el índice de la fila con el valor más grande.

index = df.Value.argmax()

Ahora, el índice podría usarse para obtener las características de esa fila en particular:

df.iloc[df.Value.argmax(), 0:2]

7

Utilice el indexatributo de DataFrame. Tenga en cuenta que no escribo todas las filas en el ejemplo.

In [14]: df = data.groupby(['Country','Place'])['Value'].max()

In [15]: df.index
Out[15]: 
MultiIndex
[Spain  Manchester, UK     London    , US     Mchigan   ,        NewYork   ]

In [16]: df.index[0]
Out[16]: ('Spain', 'Manchester')

In [17]: df.index[1]
Out[17]: ('UK', 'London')

También puede obtener el valor por ese índice:

In [21]: for index in df.index:
    print index, df[index]
   ....:      
('Spain', 'Manchester') 512
('UK', 'London') 778
('US', 'Mchigan') 854
('US', 'NewYork') 562

Editar

Perdón por malinterpretar lo que quieres, prueba lo siguiente:

In [52]: s=data.max()

In [53]: print '%s, %s, %s' % (s['Country'], s['Place'], s['Value'])
US, NewYork, 854

correcto. Pero estoy buscando una salida de una línea que diga, 'EE. UU., Kansas, 894'
richie

Gracias. Esto resolvería el problema del conjunto de datos actual donde solo hay 1 columna con valores. Cuando hay más columnas con valores, la solución de @ unutbu funcionaría mejor. Gracias de cualquier manera.
richie

5

Para imprimir el País y el Lugar con el valor máximo, use la siguiente línea de código.

print(df[['Country', 'Place']][df.Value == df.Value.max()])

2

Mi solución para encontrar valores máximos en columnas:

df.ix[df.idxmax()]

, también mínimo:

df.ix[df.idxmin()]

2

Recomendaría usarlo nlargestpara un mejor rendimiento y un código más corto. importarpandas

df[col_name].value_counts().nlargest(n=1)


2

import pandas
df es el marco de datos que crea.

Usa el comando:

df1=df[['Country','Place']][df.Value == df['Value'].max()]

Esto mostrará el país y el lugar cuyo valor es máximo.


0

Encontré un error similar al intentar importar datos usando pandas. La primera columna de mi conjunto de datos tenía espacios antes del comienzo de las palabras. Quité los espacios y funcionó de maravilla !!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.