Получить последовательные группы, взяв итоги логической серии, которая проверяет, где значение не равно «Аномолии». Используйте where
, чтобы мы брали только строки «Аномолия». Затем мы можем l oop по группам и захватить индексы.
m = df['Anomaly'].ne('Anomaly')
[[idx[0], idx[-1]] if len(idx) > 1 else [idx[0]]
for idx in df.groupby(m.cumsum().where(~m)).groups.values()]
#[[1, 2], [4]]
Или, если вы хотите использовать гораздо более длинный groupby
, вы можете получить первый и последний индекс, затем отбросить дубликаты (чтобы иметь дело с полосами только из 1) и поместить его в список списков. Хотя это намного медленнее
(df.reset_index().groupby(m.cumsum().where(~m))['index'].agg(['first', 'last'])
.stack()
.drop_duplicates()
.groupby(level=0).agg(list)
.tolist())
#[[1, 2], [4]]