Сначала удалите 0
строк перед первым 1
:
df = df[df['entry'].eq(1).cumsum().ne(0)]
df = df.groupby(df['entry'].cumsum()).head(4)
Timestamp entry
1 11.2 1
2 11.3 0
3 11.4 0
4 11.5 0
7 11.8 1
8 11.9 0
9 12.0 0
10 12.1 0
Подробности и пояснения :
Для общего решения для удаления всех значений перед первым совпадением используется сравнение по Series.eq
, затем кумулятивная сумма по Series.cumsum
и сравнение по Series.ne
- поэтому отфильтруйте все значения 0
после cumsum
операция:
print (df.assign(comp1 = df['entry'].eq(1),
cumsum =df['entry'].eq(1).cumsum(),
mask = df['entry'].eq(1).cumsum().ne(0)))
Timestamp entry comp1 cumsum mask
0 11.1 0 False 0 False
1 11.2 1 True 1 True
2 11.3 0 False 1 True
3 11.4 0 False 1 True
4 11.5 0 False 1 True
5 11.6 0 False 1 True
6 11.7 0 False 1 True
7 11.8 1 True 2 True
8 11.9 0 False 2 True
9 12.0 0 False 2 True
10 12.1 0 False 2 True
После фильтрации с помощью boolean indexing
создать помощника Series
с совокупным значением sum
для групп:
print (df['entry'].cumsum())
1 1
2 1
3 1
4 1
5 1
6 1
7 2
8 2
9 2
10 2
Name: entry, dtype: int64
Так что для окончательного решение использовать GroupBy.head
со значениями 4
для получения строк с 1
и следующих 3 строк:
df = df.groupby(df['entry'].cumsum()).head(4)
print (df)
Timestamp entry
1 11.2 1
2 11.3 0
3 11.4 0
4 11.5 0
7 11.8 1
8 11.9 0
9 12.0 0
10 12.1 0
Для l oop по группам используйте:
for i, g in df.groupby(df['entry'].cumsum()):
print (g.head(4))
Если хотите вывести список DataFrame
с:
L = [g.head(4) for i, g in df.groupby(df['entry'].cumsum())]