Вот возможное решение
for index, row in df.iterrows():
remainder = df.iloc[index:,:][(df['ID'] == row['ID']) & (df['Bool']==1)]
df.loc[index, 'Level'] = remainder.shape[0]
Это решение выполняет итерацию по всем строкам и при этом просматривает оставшиеся df (df.iloc[index:,:]
) и подсчитывает, сколько вхождений текущего идентификатора строки с встречается значение 1 типа Bool.
Надеюсь, это поможет! :)