我有一个这样的数据框
>>> df = pd.DataFrame([100, 150, 150, 103])
>>> df
0
0 100
1 150
2 150
3 103
>>>
我要检查下一个值是否小于上一个值的+ 10%或-10%,如果没有用下一个值替换下一个值
这是理想的结果
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
我该如何解决?
答案 0 :(得分:0)
这是使用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