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?

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

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


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

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]

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

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()])

2

Ma solution pour trouver les valeurs maximales dans les colonnes:

df.ix[df.idxmax()]

, également minimum:

df.ix[df.idxmin()]

2

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

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

2

Vous pouvez utiliser:

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


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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.