d = {(1): '1 time', (2): '2-3 times', (3): '2-3 times', (4): '> 3 times'}
df['FREQUENCY_GROUP'] = df.groupby('ID_PERSON')['ID_PERSON'].transform('size'
    ).clip_upper(4).map(d)
df1 = df.pivot_table(index='FREQUENCY_GROUP', columns='EVALUATION_GRADE',
    values='ID_PERSON', aggfunc='count', fill_value=0).reindex(columns=
    list(range(df.EVALUATION_GRADE.min(), df.EVALUATION_GRADE.max() + 1)),
    fill_value=0)
df1.columns = 'GRADE_' + df1.columns.astype(str)
Как сгруппировать строки по частоте?