df['D'][:-1][mask] = fun(df['B'][:-1].values, df['B'][:-1].values, df['B'][
    1:].values, df['B'][1:].values)
mask = pd.isnull(df['E'][1:])
df['E'][1:][mask] = fun(df['B'][1:].values, df['B'][1:].values, df['B'][:-1
    ].values, df['B'][:-1].values)
return df
Применяйте функцию между последующими строками более эффективным способом с помощью Pandas