我正在从数据集中删除异常值。
我决定逐一删除每列中的异常值。我的列的缺失值数量不同。
我使用了这段代码,但是它删除了包含异常值的整个行,并且由于我的数据中有许多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
但是此代码不会过滤异常值。给出了相同的结果。
此代码有什么问题?我该如何纠正?
还有其他优雅的方法可以过滤异常值吗?
答案 0 :(得分:1)
df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]
在此摘录中,您基于df_in[col_name] > fence_low
和df_in[col_name] < fence_high
选择行,因此,每次不考虑其中一种条件时,该行将被删除;
通常,如果您的一列中有30%的离群值,则30%的数据集将消失,并且有两个选择
1.填写缺失的值ffill, mean constant value ...
2.或删除这些功能(如果不是强制性的),因为在某些情况下,您最好删除某个功能,而不要过多地减少数据集
希望有帮助
答案 1 :(得分:1)
检查条件一次。 &
怎么可能。应该是|