Вы можете использовать, с cummax
, чтобы установить условие для подсчета после промо, равное 1, затем используйте mask
, чтобы исключить само промо:
df.groupby('product')\
.apply(lambda x: x.loc[x['Promo'].cummax().mask(x['Promo']==1,0) == 1,
'Purchase'].sum())
Выход:
product
apple 0
banana 8
dtype: int64