Я понимаю, что вы ищете что-то вроде этого:
cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
cond2=(cond1.eq(False))&(cond1.shift(-1).eq(True))
df['time']=df['time'].where(cond2|(~cond1)).ffill().fillna(df['time'])
print(df)
time col
0 1.0 0
1 2.0 1
2 3.0 0
3 4.0 0
4 5.0 1
5 5.0 1
6 5.0 1
7 5.0 1
8 5.0 1
9 5.0 1
Объяснение:
Используя cond1, вы выбираете значения, которые имеютподлежит замене
print(cond1)
0 False
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
9 True
Name: col, dtype: bool
Используя cond2, вы выбираете значение, на которое оно должно быть заменено
print(cond2)
0 False
1 False
2 False
3 False
4 True
5 False
6 False
7 False
8 False
9 False
Name: col, dtype: bool
на реальный набор данных:
df = pd.DataFrame({'time': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], 'col': [0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1]})
cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
print(df)
time col
0 1 0
1 2 0
2 3 0
3 4 1
4 5 1
5 6 1
6 7 0
7 8 0
8 9 0
9 10 0
10 11 0
11 12 1
12 13 1
13 14 1
14 15 1
15 16 1
16 17 1
17 18 1
18 19 1
19 20 1
cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
cond2=(cond1.eq(False))&(cond1.shift(-1).eq(True))
df['time']=df['time'].where(cond2|(~cond1)).ffill().fillna(df['time'])
print(df)
time col
0 1.0 0
1 2.0 0
2 3.0 0
3 4.0 1
4 4.0 1
5 4.0 1
6 7.0 0
7 8.0 0
8 9.0 0
9 10.0 0
10 11.0 0
11 12.0 1
12 12.0 1
13 12.0 1
14 12.0 1
15 12.0 1
16 12.0 1
17 12.0 1
18 12.0 1
19 12.0 1