Не уверен, что вы хотите сделать с первым B-1
и делением на NaN
ситуацию:
df = pd.DataFrame([1,2,3,4,5,None,6,7,8,9,10], columns=['A'])
b1 = df.A.shift(1)
b1[0] = 1
b = list(map(lambda a,b1: a if np.isnan(a) else (b1 if abs(b1-a)/b1 < 0.3 else a), df.A, b1 ))
df['B'] = b
df
A B
0 1.0 1.0
1 2.0 2.0
2 3.0 3.0
3 4.0 4.0
4 5.0 4.0
5 NaN NaN
6 6.0 6.0
7 7.0 6.0
8 8.0 7.0
9 9.0 8.0
10 10.0 9.0
согласно @jpp, вы также можете сделать версию для списка b
:
b = [a if np.isnan(a) or abs(b-a)/b >= 0.3 else b for a,b in zip(df.A,b1)]