Другое решение, использующее replace
и fillna
для работы с NaN
и Inf
:
import numpy as np
df['GrowthRate'] = (df.iloc[:, 4].div(df.iloc[:, 4].shift())
.fillna(0).replace([np.inf, -np.inf], 0))
Пример
np.random.seed(2020)
df = pd.DataFrame(np.random.randint(-3, 4, (10, 5)))
print(df)
# 0 1 2 3 4
# 0 -3 -3 0 3 0
# 1 0 2 0 -3 2
# 2 -3 -3 -3 -1 -2
# 3 0 0 -1 3 0
# 4 3 2 -3 1 1
# 5 -3 3 1 -2 -2
# 6 2 -1 -2 3 2
# 7 2 -1 3 3 3
# 8 2 1 3 3 1
# 9 -1 0 1 -2 1
df['GrowthRate'] = (df.iloc[:, 4].div(df.iloc[:, 4].shift())
.fillna(0).replace([np.inf, -np.inf], 0))
[out]
0 1 2 3 4 GrowthRate
0 -3 -3 0 3 0 0.000000
1 0 2 0 -3 2 0.000000
2 -3 -3 -3 -1 -2 -1.000000
3 0 0 -1 3 0 -0.000000
4 3 2 -3 1 1 0.000000
5 -3 3 1 -2 -2 -2.000000
6 2 -1 -2 3 2 -1.000000
7 2 -1 3 3 3 1.500000
8 2 1 3 3 1 0.333333
9 -1 0 1 -2 1 1.000000