Использование:
df = ( df.assign(counter_col_x = df.loc[df['x'].eq(8)]
.groupby(df['x'].ne(df['x'].shift())
.cumsum())
.ngroup()
#.reindex(index = df.index) #only if necessary
)
.reindex(columns = ['counter_col_x'] + df.columns.tolist()) )
или, может быть, лучше :
df = ( df.join(df.loc[df['x'].eq(8)]
.groupby(df['x'].ne(df['x'].shift())
.cumsum())
.ngroup()
#.reindex(index = df.index) #only if necessary
.rename('counter_col_x'))
)
Выход
counter_col_x x y
0 0.0 8 36
1 0.0 8 36
2 0.0 8 36
3 0.0 8 36
4 0.0 8 36
5 NaN 1 0
6 NaN 1 1
7 NaN 1 0
8 1.0 8 36
9 1.0 8 36
10 1.0 8 36
11 1.0 8 37
12 1.0 8 36
13 NaN 1 0
14 NaN 1 1
15 NaN 1 0
16 NaN 1 0
17 2.0 8 36
18 2.0 8 37
19 2.0 8 36
20 2.0 8 37
21 2.0 8 36