Maison  >  Article  >  développement back-end  >  méthode pandas pour obtenir la ligne avec la valeur maximale dans le groupe groupby

méthode pandas pour obtenir la ligne avec la valeur maximale dans le groupe groupby

不言
不言original
2018-04-20 13:38:464036parcourir

Ce qui suit est une méthode pandas pour obtenir la ligne avec la valeur maximale dans un groupe groupby. Elle a une bonne valeur de référence et j'espère qu'elle sera utile à tout le monde. Jetons un coup d'œil ensemble

Méthode Pandas pour obtenir la ligne avec la valeur maximale dans le groupe groupby

Par exemple, le DataFrame suivant est regroupés selon Mt et retirés La rangée avec le plus grand nombre

import pandas as pd
df = pd.DataFrame({'Sp':['a','b','c','d','e','f'], 'Mt':['s1', 's1', 's2','s2','s2','s3'], 'Value':[1,2,3,4,5,6], 'Count':[3,2,5,10,10,6]})

df


tr>2 tr>

Count Mt Sp Value
0 3 s1 a 1
1 2 s1 b 2
2 5 s2 c 3
3 10 s2 d 4
4 10 s2 e 5
5 6 s3 f 6
Compte Mt Sp Valeur
0 3 s1 a td> 1 td>
1 2 s1 b
2 5 s2 c 3
3 10 s2 d 4
4 10 s2 e 5
5 6 s3 f 6

Méthode 1 : filtrer les lignes avec le plus grand nombre du groupe

df.groupby('Mt').apply(lambda t: t[t.Count==t.Count.max()])


thead>10s3


Count Mt Sp Value
Mt




s1 0 3 s1 a 1
s2 3 10 s2 d 4
4 10 s2 e 5
s3 5 6 s3 f 6

Compte Mt Sp Valeur
Mt
s1 0 3 s1 a 1
s2 3 s2 d 4
4 10 s2 td> e 5
s3 5 6f 6

print df.groupby(['Mt'])['Count'].agg(max)

idx=df.groupby(['Mt'])['Count'].transform(max)
print idx
idx1 = idx == df['Count']
print idx1

df[idx1]
Méthode 2 : utilisez la transformation pour obtenir l'index de la trame de données d'origine, puis filtrez les lignes requises

Mt
s1 3
s2 10
s3 6
Name: Count, dtype: int64
0 3
1 3
2 10
3 10
4 10
5 6
dtype: int64
0 True
1 False
2 False
3 True
4 True
5 True
dtype: bool



Count Mt Sp Value
0 3 s1 a 1
3 10 s2 d 4
4 10 s2 e 5
5 6 s3 f 6

s2
Compte Mt Sp Valeur
0 3 s1 a 1
3 10 td> s2 d 4
4 10e 5
5 th> 6 s3 f 6
A Le problème avec les méthodes ci-dessus est que les valeurs des lignes 3 et 4 sont toutes la valeur maximale, donc plusieurs lignes sont renvoyées. Et si une seule ligne est renvoyée ?

idx = df.groupby('Mt')['Count'].idxmax()
print idx
Méthode 3 : idmax (l'ancienne version de pandas est argmax)

df.iloc[idx]
Mt
s1 0
s2 3
s3 5
Name: Count, dtype: int64



Count Mt Sp Value
0 3 s1 a 1
3 10 s2 d 4
5 6 s3 f 6

df.iloc[df.groupby(['Mt']).apply(lambda x: x['Count'].idxmax())]

Compte Mt Sp Valeur
0 3 s1 a 1
3 10 s2 d 4
5 6 s3 f 6


Count Mt Sp Value
0 3 s1 a 1
3 10 s2 d 4
5 6 s3 f 6

def using_apply(df):
 return (df.groupby('Mt').apply(lambda subf: subf['Value'][subf['Count'].idxmax()]))

def using_idxmax_loc(df):
 idx = df.groupby('Mt')['Count'].idxmax()
 return df.loc[idx, ['Mt', 'Value']]

print using_apply(df)

using_idxmax_loc(df)

Compte Mt Sp Valeur
0 3 s1 a 1
3 10 s2 d 4
5 6 s3 f 6
Mt
s1 1
s2 4
s3 6
dtype: int64



Mt Value
0 s1 1
3 s2 4
5 s3 6

4
Mt Valeur
0 s1 1
3 s2
5 s3 6

df.sort('Count', ascending=False).groupby('Mt', as_index=False).first()
Méthode 4 : Triez-le d'abord, puis prenez le premier de chaque groupe



Mt Count Sp Value
0 s1 3 a 1
1 s2 10 d 4
2 s3 6 f 6

Nombre

MontSp Valeur
0 s1 3 a 1
1 s2 10 d 4
2 s3 6 f 6
Ensuite, le problème revient si vous ne souhaitez pas supprimer. la ligne avec la valeur maximale. Par exemple, qu'en est-il de la ligne où se trouve la valeur médiane ?

L'idée est toujours similaire, mais certaines modifications peuvent être nécessaires dans la méthode d'écriture spécifique. Par exemple, les méthodes 1 et 2 doivent modifier l'algorithme max et la méthode 3 doit implémenter une méthode pour renvoyer l'index. Quoi qu'il en soit, après groupby, chaque groupe est une trame de données.

Recommandations associées :

pandas+dataframe implémente des opérations de sélection et de découpage de lignes et de colonnes

Démarrez avec le traitement des données Python pandas de la bibliothèque

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn