4
votes

Obtenez la ligne correspondant au maximum dans pandas GroupBy

Simple DataFrame:

   A  C
0  1  b
1  2  d

Je souhaite pour chaque valeur ( groupby ) de la colonne A, obtenir la valeur de la colonne C, pour laquelle la colonne B est maximale . Par exemple pour le groupe 1 de la colonne A, le maximum de la colonne B est 1, donc je veux la valeur "b" de la colonne C:

df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']})
df
   A  B  C
0  1  0  a
1  1  1  b
2  2  2  c
3  2  3  d

Pas besoin de supposer la colonne B est trié, la performance est la priorité absolue, puis l'élégance.


0 commentaires

4 Réponses :


4
votes
df.groupby('A').apply(lambda x: x.loc[x['B'].idxmax(), 'C'])
#    A
#1    b
#2    d
Use idxmax to find the index where B is maximal, then select column C within that group (using a lambda-function

0 commentaires

8
votes

Vérifier avec sort_values ​​ + drop_duplicates

df.sort_values('B').drop_duplicates(['A'],keep='last')
Out[127]: 
   A  B  C
1  1  1  b
3  2  3  d


3 commentaires

C'est impressionnant, je devais dire.


Accepter cette réponse car selon timeit c'est plus rapide que @ coldspeed de 0,0002 secondes [ np.mean (timeit.repeat ("df.sort_values ​​('B'). Drop_duplicates (‌ ['' A '], keep =' last ') ", number = 1, repeat = 100, globals = globals ())) ]


@GioraSimchoni Merci pour la juste considération et les délais!



4
votes

Voici un peu de plaisir avec groupby et nlargest:

df.sort_values('B').groupby('A')['C'].last().reset_index()

   A  C
0  1  b
1  2  d

Ou, sort_values ​​ , groupby et last:

(df.set_index('C')
   .groupby('A')['B']
   .nlargest(1)
   .index
   .to_frame()
   .reset_index(drop=True))

   A  C
0  1  b
1  2  d


0 commentaires

2
votes

Solution similaire à @Jondiedoop, mais évite la apply:

   A  C
0  1  b
1  2  d

u = df.groupby('A')['B'].idxmax()

df.loc[u, ['A', 'C']].reset_index(drop=1)


0 commentaires