Для улучшения производительности я предлагаю не фильтровать по группам, а при предварительной обработке для вспомогательных столбцов, а затем агрегировать только sum
и использовать последнее значение GroupBy.last
:
df1 = (df.assign(b = df['B_ID'].str.startswith('walkin').astype(int),
c = df['B_ID'].str.startswith('overbook').astype(int))
.groupby('Session')
.agg(no_show=('slot_num', 'last'),
num_of_walkin=('b', 'sum'),
num_of_overbook=('c', 'sum')
)
.reset_index())
print (df1)
Session no_show num_of_walkin num_of_overbook
0 S1 9 3 2
1 S2 8 3 2
2 S3 3 1 0