Encontre o valor máximo de uma coluna e retorne os valores da linha correspondente usando o Pandas


119

Estrutura de dados;

Usando Python Pandas estou tentando encontrar o Country& Placecom o valor máximo.

Isso retorna o valor máximo:

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

Mas como obtenho o correspondente Countrye o Placenome?

Respostas:


170

Supondo que dftenha um índice exclusivo, isso dá a linha com o valor máximo:

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

Observe que idxmaxretorna rótulos de índice . Portanto, se o DataFrame tiver duplicatas no índice, o rótulo pode não identificar exclusivamente a linha, portanto, df.locpode retornar mais de uma linha.

Portanto, se dfnão tiver um índice exclusivo, você deve torná-lo exclusivo antes de prosseguir como acima. Dependendo do DataFrame, às vezes você pode usar stackou set_indexpara tornar o índice exclusivo. Ou você pode simplesmente redefinir o índice (para que as linhas sejam renumeradas, começando em 0):

df = df.reset_index()

Obrigado. Isso era exatamente o que eu estava procurando.
richie de

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

Isso retornará a linha inteira com o valor máximo


Explicação: - A expressão interna faz uma verificação booleana em todo o comprimento do dataFrame e aquele índice que satisfaz o lado direito da expressão (.max ()) retorna o índice, que por sua vez chama a linha completa desse dataFrame
penta

11

O país e o local são o índice da série, se você não precisa do índice, pode definir as_index=False:

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

Editar:

Parece que você quer o lugar com valor máximo para cada país, o código a seguir fará o que você quiser:

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

isso retornaria apenas os nomes das colunas e os dtypes
richie

9

Acho que a maneira mais fácil de retornar uma linha com o valor máximo é obtendo seu índice. argmax()pode ser usado para retornar o índice da linha com o maior valor.

index = df.Value.argmax()

Agora, o índice pode ser usado para obter os recursos para essa linha específica:

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

8

Use o indexatributo de DataFrame. Observe que não digito todas as linhas do exemplo.

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')

Você também pode obter o valor por esse í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

Desculpe por não entender o que você quer, tente o seguinte:

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

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

corrigir. Mas estou procurando uma saída de uma linha que diga, 'EUA, Kansas, 894'
richie

Obrigado. Isso resolveria o problema para o conjunto de dados atual, onde há apenas 1 coluna com valores. Quando houver mais colunas com valores, a solução de @unutbu funcionará melhor. Obrigado mesmo assim.
richie de

5

Para imprimir o país e o local com valor máximo, use a seguinte linha de código.

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

2

Minha solução para encontrar valores máximos em colunas:

df.ix[df.idxmax()]

, também mínimo:

df.ix[df.idxmin()]

2

Eu recomendo usar nlargestpara melhor desempenho e código mais curto. importarpandas

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

2

Você pode usar:

print (df [df ['Value'] == df ['Value']. ​​max ()])


2

import pandas
df é o quadro de dados que você cria.

Use o comando:

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

Isso exibirá o país e o local cujo valor é máximo.


0

Encontrei um erro semelhante ao tentar importar dados usando o pandas. A primeira coluna do meu conjunto de dados tinha espaços antes do início das palavras. Retirei os espaços e funcionou perfeitamente !!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.