Хорошо, так что сначала давайте создадим фрейм данных
df = pd.DataFrame([-2,0,2,2,0,0,0,0,0,0,0,0,2,2,2,2,2,3,2,0,2,2,2,0,3,3,0])
df.columns = ['A']
df
Я добавил два 3 и 4 в конце только для проверки работоспособности, это дает нам
A
0 -2
1 0
2 2
3 2
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 2
13 2
14 2
15 2
16 2
17 3
18 2
19 0
20 2
21 2
22 2
23 0
24 3
25 3
26 0
Теперь мы должны увидеть, какие элементы должны быть обнулены для этого использования
prev = None
flag = 0
terminationLst = []
for val,i in zip(df['A'],df.index):
if val == 0 and prev == None: #First time encountering a zero element
prev = i
continue
if val !=0 and prev != None: #Encountering a non zero element after having seen a zero
flag = 1
elif val == 0 and i-prev > 3: Encountering a zero after more than 3 consecutive none zeros
prev = i
elif val == 0 and i-prev <=3 and flag ==1: #Encountering a zero after less than 3 consecutive non zeros
flag = 0
terminationLst.append([x for x in range(prev+1,i)])
prev = i
print (terminationLst)
, который дает нам индекс элементов, которые нам нужно повернуть в ноль [[2, 3], [24, 25], [27]]
Теперь нам просто нужно повернуть их в ноль, что можно сделать просто
for elem in terminationLst:
df['A'].iloc[elem] = 0
А теперь датафрейм становится
A
0 -2
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 2
13 2
14 2
15 2
16 2
17 3
18 2
19 0
20 2
21 2
22 2
23 0
24 0
25 0
26 0
27 0
28 0
Если у вас есть какие-либо проблемы с пониманием каких-либо конкретных частей, не стесняйтесь комментировать ниже.