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)