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"?
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()
df[df['Value']==df['Value'].max()]
Cela retournera la ligne entière avec la valeur maximale
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()))
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
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
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]
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()])
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)
Ma solution pour trouver des valeurs maximales dans les colonnes:
df.ix[df.idxmax()]
, également minimum:
df.ix[df.idxmin()]