web-dev-qa-db-fra.com

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

Structure of data;

En utilisant des pandas Python, j'essaie de trouver le «pays» et le «lieu» avec la valeur maximale.

Cela renvoie la valeur maximale:

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

Mais comment puis-je obtenir le nom correspondant à "Pays" et "Lieu"?

62
richie

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 retourne index labels. Par conséquent, si le DataFrame contient des doublons dans l'index, l'étiquette ne peut pas identifier la ligne de manière unique, donc df.loc peut renvoyer plusieurs lignes.

Par conséquent, si df ne possède pas d'index unique, vous devez le rendre unique avant de procéder comme ci-dessus. Selon le DataFrame, vous pouvez parfois utiliser stack ou set_index pour 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()
100
unutbu
df[df['Value']==df['Value'].max()]

Cela retournera la ligne entière avec la valeur maximale

22
Gaurav

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

Modifier:

Il semble que vous souhaitiez une place 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()))
8
HYRY

Utilisez l'attribut index 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

Modifier

Désolé de ne pas 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
5
waitingkuo

Je pense que le moyen le plus simple de retourner 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]
4
sharad kakran

Importer le Pandas Module

Définissez votre objet DataFrame, dites df et lisez le fichier.

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

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

Je vous recommande d'utiliser nlargest pour de meilleures performances et un code plus court. importer pandas

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

Ma solution pour trouver des valeurs maximales dans les colonnes:

df.ix[df.idxmax()]

, également minimum:

df.ix[df.idxmin()]
0
Marcin Lentner