174 votes

Trouver la valeur maximale d'une colonne et retourner les valeurs de ligne correspondantes en utilisant Pandas

Structure of data;

En utilisant Pandas en Python, j'essaie de trouver la Country & Place avec la valeur maximale.

Cela renvoie la valeur maximale :

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

Mais comment puis-je obtenir le correspondant Country y Place nom ?

219voto

unutbu Points 222216

En supposant que df a 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 idxmax indice de rendement étiquettes . Ainsi, si le DataFrame comporte des doublons dans l'index, l'étiquette peut ne pas identifier de manière unique la ligne, donc df.loc peut retourner plus d'une ligne.

Par conséquent, si df n'a pas d'index unique, vous devez rendre l'index unique avant de procéder comme ci-dessus. En fonction du DataFrame, vous pouvez parfois utiliser stack o set_index pour rendre l'index unique. Ou bien, vous pouvez simplement réinitialiser l'index (afin que les lignes soient renumérotées, en commençant par 0) :

df = df.reset_index()

100voto

Gaurav Points 1109
df[df['Value']==df['Value'].max()]

Ceci retournera la ligne entière avec la valeur maximale

17voto

sharad kakran Points 171

Je pense que le moyen le plus simple de retourner une ligne avec la valeur maximale est de récupérer 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 caractéristiques de cette ligne particulière :

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

13voto

HYRY Points 26340

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

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

Edit :

Il semble que vous voulez le lieu avec la valeur maximale pour chaque pays, le code suivant fera ce que vous voulez :

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

9voto

waitingkuo Points 7290

Utilisez le index l'attribut de DataFrame . Notez que je ne tape pas toutes les lignes dans 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 indice :

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

Modifier

Désolé de ne pas avoir compris 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X