Вы можете использовать GroupBy
+ transform
с max
. Обратите внимание, что это дает несколько максимумов для любых лет, когда существует связь. Это может или не может быть то, что вам нужно.
Как вы и просили, это можно сделать в 2 этапа, сначала суммируя, а затем вычисляя максимумы по годам.
df = pd.DataFrame({'year': [2003, 2003, 2003, 2004, 2004, 2004],
'month': [1, 2, 2, 1, 1, 2],
'AMT': [100, 200, 100, 100, 300, 100]})
# STEP 1: sum by year + month
df2 = df.groupby(['year', 'month']).sum().reset_index()
# STEP 2: filter for max by year
res = df2[df2['AMT'] == df2.groupby(['year'])['AMT'].transform('max')]
print(res)
year month AMT
1 2003 2 300
2 2004 1 400