python - 用 Pandas 向量化去除异常值

标签 python pandas

数据框中的每一列 (c) 都包含一个时间序列值,其中包含一些极端异常值,其目标是删除这些值并将它们替换为之前看到的值。

下面的代码可以正常工作,但速度非常慢,因为我需要对总共 7 个不同的列和 59 个数据帧运行此操作。有没有办法向量化此操作或以其他方式使其更快?

用之前看到的值以外的任何值替换异常值并不是真正的选择,因为这会干扰数据的时间序列性质。

for c in df.columns:
    if c == "date":
        continue
    for i in range(len(dfn)):
        if dfn[c].iloc[i] > 5*np.mean(dfn[c]):
            dfn[c].iloc[i] = dfn[c].iloc[i-1]
    end_df = end_df.append(dfn)

异常值去除替换示例输入:

[10, 28, 39, 48193, 14]

异常值移除替换的示例输出:

[10, 28, 39, 39, 14]

最佳答案

您可以根据您想要的条件(在本例中为平均数的 5 倍)过滤数据框并替换为 nan。然后你可以使用内置的 pandas 函数 fillna 来替换之前看到的值。

你的代码将是

import numpy as np

for c in df.columns:
    if c == "date":
        continue
    df.loc[df[c] > 5 * df[c].mean(), c] = np.nan
    df[c].fillna(method='ffill', inplace=True)

关于python - 用 Pandas 向量化去除异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174254/

相关文章:

Python 导入模块最佳实践

python - Python AsyncIO 的 loop.add_reader() 期望什么文件描述符对象?

python - pandas - 使用 'melt' 函数 reshape 表格

python - 在 Dask apply 中返回结构化行

python - 我在随机森林分类器中收到“未拟合”错误?

python - 从二维数据到具有多索引列的一维 Pandas

python - Tornado 多进程: create multiple MySQL connections

python - yfinance json.decoder.JSONDecodeError

python - 在 Pandas 系列中对行中的值进行排序的方法?

python - 如何使用 fill_between 按月创建最小-最大图