Вы также можете использовать свертки для своего конкретного случая.
Вы можете использовать следующий фильтр:
[0.5, 0, 0.5]
То есть вы получаете местоположение только в том случае, если окружающие места принадлежат одному.,
Затем вы можете использовать это в качестве индекса, чтобы изменить значение ряда на 1.
from scipy.signal import convolve
print(df)
0 1
1 0
2 0
3 0
4 1
5 0
6 1
7 0
8 0
9 1
10 0
11 1
12 0
13 1
14 0
dtype: int64
df.iloc[convolve(df, [0.5, 0, 0.5], mode='same') == 1] = 1
print(df)
0 1
1 0
2 0
3 0
4 1
5 1
6 1
7 0
8 0
9 1
10 1
11 1
12 1
13 1
14 0
Выполнена небольшая проверка времени:
def check_convolve(df):
df.iloc[convolve(df, [0.5, 0, 0.5], mode='same') == 1] = 1
def check_shifts(df):
m1 = df.shift() == 1
m2 = df.shift(-1) == 1
m3 = df == 0
df = np.where(m1 & m2 & m3, 1, df[0])
%timeit check_convolve(df)
205 µs ± 22.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit check_shifts(df)
1.16 ms ± 37.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)