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.
4 Réponses :
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
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
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!
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
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)