У меня есть dataframe, как это
>>> df = pd.DataFrame([100, 150, 150, 103])
>>> df
0
0 100
1 150
2 150
3 103
>>>
Я хочу проверить, будет ли следующее значение меньше +10% или -10% от значения previus, если не заменить следующее значение с предыдущим значением
Это желаемый результат
0
0 100
1 100
2 100
3 103
Я попытался использовать "where", но он не работает должным образом
>>> df.where(abs(df / df.shift()-1) < 0.1, df.shift().fillna(method='bfill'), inplace=True)
>>> df
0
0 100
1 100
2 150
3 150
как я могу решить?
Это метод ручной циклы с использованием pd.Series.iteritems
.
df = pd.DataFrame([100, 150, 150, 103])
res = np.zeros(len(df[0]))
res[0] = df[0].iloc[0]
for idx, val in df[0].iloc[1:].iteritems():
if abs(val / res[idx-1] - 1) < 0.1:
res[idx] = val
else:
res[idx] = res[idx-1]
df[1] = res.astype(int)
print(df)
0 1
0 100 100
1 150 100
2 150 100
3 103 103