Деление на предыдущий ряд в pandas с условием - PullRequest
2 голосов
/ 13 марта 2020

Я пытаюсь создать новый столбец, который является делением предыдущего ряда. Но некоторые строки имеют значение 0. Итак, мой оператор условия: если деление между двумя строками равно бесконечности или нан, значение в столбце «Скорость роста» будет равно 0. В противном случае это будет деление с предыдущей строкой.

'' 'n = len (df) для j в диапазоне (0, n-1):

if ((df.iloc[j,4]/df.iloc[j-1,4]) == inf):
    df['GrowthRate']=0
else:
    df['GrowthRate'] = df.iloc[j,4]/df.iloc[j-1,4]
    j=j+1

'' '

Выходные данные - все мои значения в столбце: inf.

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Другое решение, использующее 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
1 голос
/ 13 марта 2020

, если указанное выше значение равно 0, то делится на np.inf, что приводит к 0, иначе делится на предыдущее значение

col = df.iloc[:,4]
df['GrowthRate'] = col.div(col.where(col.eq(0), np.inf))

Если вам нужно заполнить NaN в конце:

df['GrowthRate'] = col.div(col.where(col.eq(0), np.inf)).fillna(0)
...