Trova il valore massimo di una colonna e restituisci i valori di riga corrispondenti utilizzando Pandas


117

Struttura dei dati;

Utilizzando Python Pandas sto cercando di trovare la Country& Placecon il valore massimo.

Questo restituisce il valore massimo:

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

Ma come ottengo il corrispondente Countrye il Placenome?

Risposte:


170

Supponendo che dfabbia un indice univoco, questo fornisce la riga con il valore massimo:

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

Nota che idxmaxrestituisce le etichette dell'indice . Quindi, se il DataFrame ha duplicati nell'indice, l'etichetta potrebbe non identificare in modo univoco la riga, quindidf.loc potrebbe restituire più di una riga.

Pertanto, se dfnon si dispone di un indice univoco, è necessario rendere unico l'indice prima di procedere come sopra. A seconda del DataFrame, a volte puoi usarestack o set_indexper rendere univoco l'indice. Oppure puoi semplicemente reimpostare l'indice (in modo che le righe vengano rinumerate, a partire da 0):

df = df.reset_index()

Grazie. Era esattamente quello che stavo cercando.
Richie

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

Ciò restituirà l'intera riga con il valore massimo


Spiegazione: - L'espressione interna esegue un controllo booleano per tutta la lunghezza di dataFrame e quell'indice che soddisfa il lato destro dell'espressione (.max ()) restituisce l'indice, che a sua volta chiama la riga completa di quel dataFrame
penta

10

Il paese e il luogo sono l'indice della serie, se non ti serve l'indice puoi impostare as_index=False:

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

Modificare:

Sembra che tu voglia il luogo con il valore massimo per ogni paese, il seguente codice farà quello che vuoi:

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

che restituirebbe solo i nomi delle colonne e i dtypes
richie

8

Penso che il modo più semplice per restituire una riga con il valore massimo sia ottenere il suo indice. argmax()può essere utilizzato per restituire l'indice della riga con il valore più grande.

index = df.Value.argmax()

Ora l'indice potrebbe essere utilizzato per ottenere le funzionalità per quella particolare riga:

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

7

Usa l' indexattributo di DataFrame. Nota che non digito tutte le righe nell'esempio.

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

Puoi anche ottenere il valore da quell'indice:

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

modificare

Ci scusiamo per aver capito male quello che vuoi, prova quanto segue:

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

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

corretta. Ma sto cercando un'uscita di una riga che dica "US, Kansas, 894"
richie

Grazie. Ciò risolverebbe il problema per il set di dati corrente in cui è presente solo 1 colonna con valori. Quando ci sono più colonne con valori, la soluzione di @ unutbu funzionerebbe meglio. Grazie comunque.
Richie

5

Per stampare il Paese e la località con il valore massimo, utilizzare la seguente riga di codice.

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

2

La mia soluzione per trovare i valori massimi nelle colonne:

df.ix[df.idxmax()]

, anche minimo:

df.ix[df.idxmin()]

2

Ti consiglio di utilizzare nlargestper prestazioni migliori e codice più breve. importarepandas

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

2

Puoi usare:

stampare (df [df [ 'Valore'] == df [ 'Valore']. max ()])


2

import pandas
df è il data frame che crei.

Usa il comando:

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

Questo mostrerà il paese e il luogo il cui valore è massimo.


0

Ho riscontrato un errore simile durante il tentativo di importare i dati utilizzando i panda, la prima colonna del mio set di dati aveva spazi prima dell'inizio delle parole. Ho tolto gli spazi e ha funzionato a meraviglia !!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.