dff
dff['grpb'] = np.NaN
breaks = dff[dff.a == 'B'].index
dff['grpb'][breaks] = list(range(len(breaks)))
dff.fillna(method='bfill').fillna(len(breaks))
Лучший способ разделить DataFrame с учетом преимущества