【问题标题】:Vectorizing Removing Outliers with Pandas使用 Pandas 向量化去除异常值
【发布时间】:2018-07-04 12:56:44
【问题描述】:

数据框中的每一列 (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]

【问题讨论】:

  • 是否有意在每次迭代时重新计算列的平均值? (请注意,一旦你修复了一个异常值,平均值就会改变
  • @FLab 非常好。没想到这个,肯定只计算一次。

标签: python pandas


【解决方案1】:

您可以根据您想要的条件(在本例中为平均值的 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)

【讨论】:

  • 完美,这个解决方案大大减少了执行时间。谢谢!
猜你喜欢
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2015-07-29
  • 2019-07-06
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多