Использование GroupBy
и cumsum
для создания групп последовательных отрицательных чисел.
grps = df['test'].gt(0).cumsum()
dfs = [d.dropna() for _, d in df.mask(df['test'].gt(0)).groupby(grps) if d.shape[0] >= 3]
Вывод
for df in dfs:
print(df)
test
0 -1.0
1 -2.0
2 -3.0
test
6 -5.0
7 -4.0
8 -3.0
9 -7.0
Пояснение
Давайте go пройдем этот шаг за шагом: Первая строка создает группы для последовательных отрицательных чисел
print(grps)
0 0
1 0
2 0
3 1
4 1
5 2
6 2
7 2
8 2
9 2
Name: test, dtype: int32
Но, как мы видим, она также включает в себя положительные числа, которые мы не хотим учитывать в нашем выводе. Поэтому мы используем DataFrame.mask
для преобразования этих значений в NaN
:
df.mask(df['test'].gt(0))
# same as df.mask(df['test'] > 0)
test
0 -1.0
1 -2.0
2 -3.0
3 NaN
4 -4.0
5 NaN
6 -5.0
7 -4.0
8 -3.0
9 -7.0
Затем мы группируем данные на этом кадре данных и сохраняем только те группы, которые >=
3 строки:
for _, d in df.mask(df['test'].gt(0)).groupby(grps):
if d.shape[0] >= 3:
print(d.dropna())
test
0 -1.0
1 -2.0
2 -3.0
test
6 -5.0
7 -4.0
8 -3.0
9 -7.0