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?

Richie
fuente

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()
unutbu
fuente
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

Gaurav
fuente
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()))
HYRY
fuente
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]
Sharad Kakran
fuente
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
esperando
fuente
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()])
Arpit Sharma
fuente
2

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

df.ix[df.idxmax()]

, también mínimo:

df.ix[df.idxmin()]
Marcin Lentner
fuente
2

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

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

Puedes usar:

print (df [df ['Valor'] == df ['Valor']. max ()])

kelvinkahuro
fuente
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.

raksha
fuente
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 !!

Jefferson Sankara
fuente