【问题标题】:Removing outlier from a single column从单个列中删除异常值
【发布时间】:2019-09-23 21:00:30
【问题描述】:

我正在从数据集中删除异常值。

我决定从每一列中逐一删除异常值。我有不同数量的缺失值的列。

我使用了这段代码,但它删除了包含异常值的整行,并且由于我的数据中有许多 NaN 值,我的数据行数急剧减少。

def remove_outlier(df_in, col_name):
    q1 = df_in[col_name].quantile(0.25)
    q3 = df_in[col_name].quantile(0.75)
    iqr = q3-q1 #Interquartile range
    fence_low  = q1-1.5*iqr
    fence_high = q3+1.5*iqr
    df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]
    return df_out

然后我决定从每列中删除异常值,并在每列中用 NaN 填充 ouliers 我写了这段代码

def remove_outlier(df_in, col_name, thres=1.5):
    q1 = df_in[col_name].quantile(0.25)
    q3 = df_in[col_name].quantile(0.75)
    iqr = q3-q1 #Interquartile range
    fence_low  = q1-thres*iqr
    fence_high = q3+thres*iqr
    mask = (df_in[col_name] > fence_high) & (df_in[col_name] < fence_low)
    df_in.loc[mask, col_name] = np.nan
    return df_in

但此代码不会过滤异常值。给出了相同的结果。

这段代码有什么问题?我该如何纠正?

还有其他优雅的过滤异常值的方法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    检查一次条件。那怎么可能是&amp;。应该是|

    【讨论】:

    • 我应该一次过滤所有列的异常值,还是应该逐个过滤(根据特定列更改阈值)?
    【解决方案2】:
    df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]
    

    在此代码段中,您根据df_in[col_name] &gt; fence_lowdf_in[col_name] &lt; fence_high 选择行,因此每次不遵守这些条件之一时,该行将被删除;

    作为一般规则,如果您有一列包含 30% 的异常值,则 30% 的数据集将消失,您有两个选择
    1.填写缺失值ffill, mean constant value ...
    2. 或者删除这些特征,如果它不是强制性的,因为在某些时候你最好删除一个特征而不是减少你的数据集太多

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 1970-01-01
      • 2011-06-06
      • 2020-10-04
      • 2020-08-28
      • 2023-02-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多