python - 将 pandas 数据框列中的值替换为前一个值

标签 python pandas dataframe series outliers

我的代码检测时间序列中的异常值。我想要做的是将第一个数据帧列中的异常值替换为之前的值,该值不是异常值。

这段代码只是检测异常值,创建一个 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/

相关文章:

python - 将非唯一列表的虚拟对象创建到 Python 中的列中

python - 安装基于 pyproject.toml 的项目所需的错误 : Could not build wheels for pandas,

python - 使用 2 个标识符合并数据帧

python - pandas 的错误/功能,其中按日期过滤的多索引数据框在提取日期索引级别时返回所有未过滤的日期

python - Django 和 threading.local() 怪癖?

python - 从 python (windows) 中的文本文件中读取行

Python 从文件中搜索字符串值

python - Pandas - 将应用函数的结果数据帧合并到新的数据帧中

python - Pandas 将字典连接到数据框

python - “模块”对象没有属性 'GeoSQLCompiler'