Пока в голову приходит что-то такое через лист компрехенсив, но если unique_vals_clmn1 слишком большой это может затянуться надолго
А код оставляет последние 100 строк для каждого уникального значения column1, т.е. он удаляет дубликаты по column1, сохраняя последние 100 строк
unique_vals_clmn1 = df['column1'].unique().tolist()
df = pd.concat([df[df['column1']==unique_val_clmn1].tail(n=100) for unique_val_clmn1 in unique_vals_clmn1]).reset_index().sort_values('index', ascending=True).set_index('index')