Эту проблему можно разделить на две части.Сначала вы хотите сгруппировать как Id
, так и последовательные элементы в серии Event
.Это может быть выполнено с использованием shift
+ cumsum
m = df.Event.ne(df.Event.shift()).cumsum()
df['count'] = df.groupby(['Id', m])['Event'].transform('size')
print(df)
Id Seqno. Event count
0 1 2 A 1
1 1 3 B 1
2 1 5 A 3
3 1 6 A 3
4 1 7 A 3
5 1 8 B 1
6 1 9 C 1
7 1 10 D 1
Это дает нам серию, которая идентифицирует последовательные прогоны в нашем столбце Event
, но теперь мы хотимсделать поиск простым.Мы можем drop_duplicates
, чтобы каждое условие возвращало только один прогон для Id/Event/count
, а затем использовать логическое индексирование:
f = df[['Id', 'Event', 'count']].drop_duplicates()
f.loc[f.Event.eq('A') & f['count'].gt(2)]
Id Event count
2 1 A 3