针对在单个列中发现的离群值删除数据集的整行

Deleting entire rows of a dataset for outliers found in a single column

我目前正在尝试使用中值绝对偏差法从我的数据集中删除离群值。

为此,我遵循了@tanemaki 在 Detect and exclude outliers in Pandas data frame 中给出的说明,该说明可以删除包含至少一个离群值的整行。

在我链接的 post 中,有人问了同样的问题,但没有得到回答。

问题是我只想在单个列中搜索异常值

因此,例如,我的数据框如下所示:


          Temperature    Date       
    1        24.72        2.3        
    2        25.76        4.6        
    3        25.42        7.0        
    4        40.31        9.3        
    5        26.21       15.6
    6        26.59       17.9        
 

比如数据中有两个'异常:

所以,我想要的是离群值函数只'notice'温度列中的异常,并删除其对应的行。

我使用的离群代码是:

df=pd.read_excel(r'/home/.../myfile.xlsx')
from scipy import stats
df[pd.isnull(df)]=0
dfn=df[(np.abs(stats.zscore(df))<4).all(axis=1)] #@taneski
print(dfn)

我生成的数据框目前看起来像:


          Temperature    Date       
    1        24.72        2.3        
    2        25.76        4.6        
    3        25.42        7.0               
    6        26.59       17.9        

如果我没有传达我的信息,期望的输出将是:


          Temperature    Date       
    1        24.72        2.3        
    2        25.76        4.6        
    3        25.42        7.0  
    5        26.21       15.6         
    6        26.59       17.9        

任何指点都会有很大帮助。谢谢!

您始终可以将 stats.zscore 操作限制在 Temperature 列而不是整个 df 列。像这样也许:

In [573]: dfn = df[(np.abs(stats.zscore(df['Temperature']))<4)]                                                                                                                                             

In [574]: dfn                                                                                                                                                                                               
Out[574]: 
   Temperature  Date
1        24.72   2.3
2        25.76   4.6
3        25.42   7.0
5        26.21  15.6
6        26.59  17.9

目前,您正在计算整个数据帧的 zscores,然后使用计算出的分数过滤数据帧;您要做的只是将相同的想法应用到一列中。

而不是

dfn=df[(np.abs(stats.zscore(df))<4).all(axis=1)]

你想要

df[np.abs(stats.zscore(df["Temperature"])) < 4]

作为旁注,我发现我无法通过将 zscores 与 4 进行比较来获得您的示例结果;我不得不把它调低到 2。