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
Copier après la connexion
| 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 | tr>
---|
0 | 3 | s1 | a td> | 1 td> |
---|
1 | 2 | s1 | b | < td>2< /tr>
---|
2 | 5 | s2 | c | 3 |
3 | 10 | s2 | d | 4 |
---|
4 | 10 | s2 | e | 5 | tr>
5 | 6 | s3 | f | 6 |
< /tbody>
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()])
Copier après la connexion
|
| 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 | | | | | |
thead>s1 | 0 | 3 | s1 | a | 1 |
---|
s2 | 3 | < td>10 s2 | d | 4 |
---|
4 | 10 | s2 td> | e | 5 |
---|
s3 | 5 | 6 | < td>s3f | 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]
Copier après la connexion
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
Copier après la connexion
| Count | Mt | Sp | Value |
---|
0 | 3 | s1 | a | 1 |
---|
3 | 10 | s2 | d | 4 |
---|
4 | 10 | s2 | e | 5 |
---|
5 | 6 | s3 | f | 6 |
---|
| Compte | Mt | Sp | Valeur |
0 | 3 | s1 | a | 1 |
---|
3 | 10 td> | s2 | d | 4 |
4 | 10 | < td>s2e | 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
Copier après la connexion
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
Copier après la connexion
| 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())]
Copier après la connexion
| 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)
Copier après la connexion
| 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
Copier après la connexion
< thead> | Mt | Valeur |
< tr> 0 | s1 | 1 | 3 | s2 | < td> 4
---|
5 | s3 | 6 |
---|
df.sort('Count', ascending=False).groupby('Mt', as_index=False).first()
Copier après la connexion
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 |
|
Mont | NombreSp |
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!