Редактировать: Я изменил все вокруг, чтобы сопоставить изменения, внесенные ОП с вопросом
Вы можете делать то, что хотите, в векторизованном виде без каких-либо циклов, таких как:
import pandas as pd
d = {'open': [3] + [0]*4, 'inOut': [100, 300, 200, 230, 150], 'close': [0]*5}
df = pd.DataFrame(d)
df['close'].values[:] = df['open'].values[0] + df['inOut'].values.cumsum()
df['open'].values[1:] = df['close'].values[:-1]
Синхронизация с %%timeit
:
529 µs ± 5.39 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Вывод:
close inOut open
0 103 100 3
1 403 300 103
2 603 200 403
3 833 230 603
4 983 150 833
Так что векторизация вашего кода таким способом действительно несколько быстрее.На самом деле, это, вероятно, как можно быстрее.Вы можете увидеть это, синхронизировав только код создания фрейма данных:
%%timeit
d = {'open': [3] + [0]*4, 'inOut': [100, 300, 200, 230, 150], 'close': [0]*5}
df = pd.DataFrame(d)
Результат:
367 µs ± 5.67 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Вычитая время, необходимое для создания фрейма данных, векторизованной версии заполнения вашегодатафрейм занимает всего ~ 160 мкс.