从单列中删除异常值

时间:2019-05-06 08:37:57

标签: python pandas

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

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

我使用了这段代码,但是它删除了包含异常值的整个行,并且由于我的数据中有许多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

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

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

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

2 个答案:

答案 0 :(得分:1)

df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]

在此摘录中,您基于df_in[col_name] > fence_lowdf_in[col_name] < fence_high选择行,因此,每次不考虑其中一种条件时,该行将被删除;

通常,如果您的一列中有30%的离群值,则30%的数据集将消失,并且有两个选择
1.填写缺失的值ffill, mean constant value ...
2.或删除这些功能(如果不是强制性的),因为在某些情况下,您最好删除某个功能,而不要过多地减少数据集

希望有帮助

答案 1 :(得分:1)

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