【问题标题】:Winsorize outliersWinsorize 异常值
【发布时间】:2019-11-06 11:33:51
【问题描述】:

我有一个包含 200,000 个观察值和 23 个不同列的数据框。我绘制了数据,发现每一列都有异常值。因此,我想对完整的数据框进行缩尾处理。起初,我的代码确实有效。不过速度很慢。但是,现在我只收到“系列”对象不可调用的消息。我怎样才能解决这个问题?

我使用以下代码对日期帧进行优化:

lower = 0.01 upper = 0.99 quantile_df = df.quantile([lower,upper]) quant_df

定义四分位数后,我将异常值从数据框中过滤掉:

df =df.apply(lambda x: x(x > quant_df.loc[lower,x.name]) & 
                                (x < quant_df.loc[upper,x.name]), axis=0)

【问题讨论】:

    标签: python dataframe outliers


    【解决方案1】:

    据我了解,您正在尝试过滤掉每列的异常值。 因此,您可以遍历列,并每次过滤:

    for target_col in df.columns:
        # get upper/lower bound
        df['lower'], df['upper']= df[target_col].quantile([lower, upper])
        # filter
        df = df[(df[target_col] > df['lower']) & (df[target_col] < df['upper'])]
    

    您可能需要将 df.columns 更改为它的任何子集。

    【讨论】:

    • 感谢您的回答!当我以这种方式尝试时,我收到一条错误消息:“&: 'float' 和 'int' 的操作数类型不受支持”。如果我将其替换为“and”,我会收到消息:“Series 的真值是不明确的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all ()”。我仍然不知道如何解决这个问题。
    • @JulianLo 嘿,我只是编辑它。错误的原因是 & 在执行期间具有更高的优先级。因此,要让 2 个条件一起工作,我们需要将它们保留在 () 中。
    • 嗨,也许你可以帮我解决一个额外的问题。当我对特定列进行优化时,Python 会删除数据框中的完整行。因此,稍后需要进行 Winsorized 的列将被此代码多次 Winsorized。你知道如何解决这个问题吗?
    • 所以您可能只想要结果的副本?或者您可以简单地添加一个存储结果掩码的列
    • 我需要 Winsorized 数据用于以后的计算。如果我在整个数据帧上执行代码,只要一个值是异常值,就会删除一整行。那不是我的意图。对所有列一一执行winsorize过程并将结果存储在一个新的数据框中是一项相当大的活​​动。你知道更快的方法吗?
    猜你喜欢
    • 2014-03-23
    • 2018-06-26
    • 2021-08-11
    • 2020-10-31
    • 2014-12-17
    • 2020-08-23
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多