Вы можете использовать функцию rank
, чтобы получить упорядоченный номер строки для каждой группы, и только взять первые 2 строки для каждой группы, чтобы получить нужный кадр данных.
В коде:
df1['rn'] = df1.groupby('year')['rank'].rank(ascending=False)
result_df = df1[df1['rn'] <= 2].drop('rn', axis=1)
Что дает желаемый результат:
year rank name
0 1999 5 ria
1 1999 3 kay
3 2000 4 ria
4 2000 2 manny
Изменение числа 2 на любой желаемый N
даст верхние N
строки из каждой группы.