我的代码检测时间序列中的异常值。我想要做的是将第一个数据帧列中的异常值替换为之前的值,该值不是异常值。
这段代码只是检测异常值,创建一个 bool 数组,其中:
True
表示数据框中的值是异常值False
表示数据框中的值不是异常值
series = read_csv('horario_completo.csv', header=None, squeeze=True) df=pd.DataFrame(series) from pandas import rolling_median consumos=df.iloc[:,0] df['rolling_median'] = rolling_median(consumos, window=48, center=True).fillna(method='bfill').fillna(method='ffill') threshold =50 difference = np.abs(consumos - df['rolling_median']) outlier = difference > threshold
到目前为止,一切正常。
我想到的下一步是创建一个掩码,将 True
值替换为同一列的前一个值(如果可能的话,它会比创建循环快得多) .
我将尝试用一个小例子来解释它:
这就是我所拥有的:
index consumo
0 54
1 67
2 98
index outlier
0 False
1 False
2 True
这就是我想做的:
index consumo
0 54
1 67
2 67
我想我应该创建一个像这样的面具:
df.mask(outlier, df.columns=[[0]][i-1],axis=1)
显然这不是这样的写法。这只是对我认为如何做到这一点的解释(我正在谈论 [i-1])。
最佳答案
看来你需要shift
:
consumo = consumo.mask(outlier, consumo.shift())
print (consumo)
0 54.0
1 67.0
2 67.0
Name: consumo, dtype: float64
如果所有值都是整数,则最后添加 astype
:
consumo = consumo.mask(outlier, consumo.shift()).astype(int)
print (consumo)
0 54
1 67
2 67
Name: consumo, dtype: int32
关于python - 将 pandas 数据框列中的值替换为前一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44282802/