Мы можем использовать GroupBy.ffill
для заполнения по группам, поэтому всякий раз, когда flag == N
и value
имеют значение null, он не будет заполнен, пока значение не станет отличным от нуля, чтобы заполнить только когда флаг Y
вы можете использовать закомментированный код.
blocks = (df['flag'].eq('N') & df['value'].isnull()).cumsum()
df['new_val'] = df['value'].groupby(blocks).ffill()
# if you want fill only if flag is Y
#df['new_val'] = df['value'].fillna(df['value'].groupby(blocks)
# .ffill()
# .where(df['flag'].eq('Y'))
# )
print(df)
Вывод
flag value new_val
0 Y 1.0 1.0
1 Y 2.0 2.0
2 Y NaN 2.0
3 N 3.0 3.0
4 Y NaN 3.0
5 Y 5.0 5.0
6 N NaN NaN
7 Y NaN NaN
8 Y NaN NaN
9 N 6.0 6.0
10 Y NaN 6.0
11 Y NaN 6.0
12 Y NaN 6.0
13 Y NaN 6.0
14 Y NaN 6.0