mask
+ ffill
В этом ответе предполагается, что в фрейме данных появляется Start
до и End
, иначе заполнение будет отменено.
col = df['Column1']
m = col.ne('Start') & col.shift().ne('End')
v = col.eq('Start').mask(m).ffill().fillna(0)
v.groupby(v.ne(v.shift()).cumsum()).cumsum()
0 0.0
1 0.0
2 0.0
3 0.0
4 1.0
5 2.0
6 3.0
7 4.0
8 5.0
9 0.0
10 0.0
11 0.0
12 1.0
13 2.0
14 3.0
Name: Column1, dtype: float64
Объяснение
Сначала найдите любое значение, которое не начало или конец
>>> m
0 True
1 True
2 True
3 True
4 False
5 True
6 True
7 True
8 True
9 False
10 True
11 True
12 False
13 True
14 True
Name: Column1, dtype: bool
Далее mask
любое недопустимое значение и ffill
, что означает, что все значения между Start
и End
с должны быть заполнены 1
>>> v
0 0.0
1 0.0
2 0.0
3 0.0
4 1.0
5 1.0
6 1.0
7 1.0
8 1.0
9 0.0
10 0.0
11 0.0
12 1.0
13 1.0
14 1.0
Name: Column1, dtype: float64
Наконец, сгруппируйте по последовательным повторным значениям, и cumsum
.