idxmax
Должно работать, пока index
уникален или максимальный индекс не повторяется.
df.loc[df.groupby('ID').date.idxmax()]
OP (отредактировано)
Должно работать, пока максимальные значения уникальны.В противном случае вы получите все строки, равные максимуму.
df[df.groupby('ID')['date'].transform('max') == df['date']]
WB перейдите к решению
А также очень хорошее решение.
df.sort_values(['ID', 'date']).drop_duplicates('date', keep='last')