Rechercher la valeur maximale d'une colonne et renvoyer les valeurs de ligne correspondantes à l'aide de Pandas

121

Structure des données;

En utilisant Python Pandas, j'essaie de trouver le Country& Placeavec la valeur maximale.

Cela renvoie la valeur maximale:

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

Mais comment obtenir le nom Countryet le correspondant Place?

Richie
la source

Réponses:

170

En supposant qu'il dfpossède un index unique, cela donne la ligne avec la valeur maximale:

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

Notez que idxmaxrenvoie les étiquettes d' index . Ainsi, si le DataFrame a des doublons dans l'index, l'étiquette peut ne pas identifier de manière unique la ligne, donc df.locpeut renvoyer plus d'une ligne.

Par conséquent, s'il dfn'a pas d'index unique, vous devez rendre l'index unique avant de procéder comme ci-dessus. Selon le DataFrame, vous pouvez parfois utiliser stackou set_indexpour rendre l'index unique. Ou, vous pouvez simplement réinitialiser l'index (pour que les lignes soient renumérotées, à partir de 0):

df = df.reset_index()
unutbu
la source
Je vous remercie. C'était exactement ce que je cherchais.
richie
57
df[df['Value']==df['Value'].max()]

Cela renverra la ligne entière avec la valeur maximale

Gaurav
la source
Explication: - L'expression interne effectue une vérification booléenne sur toute la longueur du dataFrame et de cet index qui satisfait le côté droit de l'expression (.max ()) renvoie l'index, qui à son tour appelle la ligne complète de ce dataFrame
penta
11

Le pays et le lieu sont l'index de la série, si vous n'avez pas besoin de l'index, vous pouvez définir as_index=False:

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

Éditer:

Il semble que vous vouliez l'endroit avec une valeur maximale pour chaque pays, le code suivant fera ce que vous voulez:

df.groupby("country").apply(lambda df:df.irow(df.value.argmax()))
HYRY
la source
qui ne renverrait que les noms de colonne et les types de caractères
richie
9

Je pense que le moyen le plus simple de renvoyer une ligne avec la valeur maximale est d'obtenir son index. argmax()peut être utilisé pour renvoyer l'index de la ligne avec la plus grande valeur.

index = df.Value.argmax()

Maintenant, l'index peut être utilisé pour obtenir les fonctionnalités de cette ligne particulière:

df.iloc[df.Value.argmax(), 0:2]
Sharad Kakran
la source
8

Utilisez l' indexattribut de DataFrame. Notez que je ne tape pas toutes les lignes de l'exemple.

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

Vous pouvez également obtenir la valeur par cet index:

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

Éditer

Désolé de mal comprendre ce que vous voulez, essayez ce qui suit:

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

In [53]: print '%s, %s, %s' % (s['Country'], s['Place'], s['Value'])
US, NewYork, 854
en attente
la source
correct. Mais je recherche une sortie sur une ligne qui dit: `` États-Unis, Kansas, 894 ''
richie
Merci. Cela résoudrait le problème pour l'ensemble de données actuel où il n'y a qu'une seule colonne avec des valeurs. Quand il y a plus de colonnes avec des valeurs, la solution de @ unutbu fonctionnera mieux. Merci quand même.
richie
5

Pour imprimer le pays et le lieu avec une valeur maximale, utilisez la ligne de code suivante.

print(df[['Country', 'Place']][df.Value == df.Value.max()])
Arpit Sharma
la source
2

Ma solution pour trouver les valeurs maximales dans les colonnes:

df.ix[df.idxmax()]

, également minimum:

df.ix[df.idxmin()]
Marcin Lentner
la source
2

Je recommanderais d'utiliser nlargestpour de meilleures performances et un code plus court. importerpandas

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

Vous pouvez utiliser:

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

kelvinkahuro
la source
2

import pandas
df est le bloc de données que vous créez.

Utilisez la commande:

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

Cela affichera le pays et le lieu dont la valeur est maximale.

raksha
la source
0

J'ai rencontré une erreur similaire en essayant d'importer des données à l'aide de pandas.La première colonne de mon ensemble de données avait des espaces avant le début des mots. J'ai supprimé les espaces et cela a fonctionné comme un charme !!

Jefferson Sankara
la source