【问题标题】:How to remove outlier from rows of a data frame having multiple column with similar name?如何从具有多个具有相似名称的列的数据框中的行中删除异常值?
【发布时间】:2018-12-04 14:19:58
【问题描述】:

我有一个包含多个列的数据框(大约 300 个,这里我只发布了五个),名称相似,看起来像这样:

   wave          rv           rv           rv           rv          rv                                                                      
4050.32  516.046391  1177.388115   291.478871   667.855218  139.966111   
4512.99  523.027066  1121.650093   304.243851   366.686912   21.157569   
4523.40  653.480487  1258.712111   565.797456   685.889408  211.022502   
4551.65  543.679071  1170.182836   615.175059   538.739229  217.254275   
4554.46  613.018264  1218.368040   512.241826   580.040475  148.860819   
4555.49  660.986074  1310.192328   727.650639   652.957370  241.255968   

现在,如果我尝试计算每一行的MADMEDIAN,它就会受到异常值的影响。

df['mean_rv']=df.rv.mean(axis=1)
df['mad_rv']=df.rv.mad(axis=1)
df['std_rv']=df.rv.std(axis=1)
df['median_rv']=df.rv.median(axis=1)


wave        mean_rv      mad_rv      std_rv   median_rv                                                                    
4050.32  205.140781  515.455058  675.407100  402.282291   
4512.99  185.022378  527.156411  694.815800  388.641627   
4523.40  305.709437  508.197990  656.888951  565.797456   
4551.65  245.231088  510.966951  663.052403  479.494050   
4554.46  249.040192  546.425471  707.440193  496.937762   
4555.49  354.556840  510.052320  658.062092  586.095377   

如果我想从数据框中删除异常值,我该怎么做呢?

【问题讨论】:

    标签: python pandas dataframe multiple-columns outliers


    【解决方案1】:

    就像您一般排除任何地方一样 - 通常根据 STD 定义阈值,然后应用过滤器:

    mean = df.rv.mean(axis=1)
    std  = df.rv.std(axis=1)
    new_mean = df.rv[abs(df.rv.subtract(mean,axis=0)).lt(std,axis=0)].mean(axis=1)
    

    lt 中,您可以定义std2*std 等,具体取决于什么是异常值。注意

    df.rv[abs(df.rv.subtract(mean,axis=0)).lt(std,axis=0)]
    

    将包含您的异常值所在的 nan 值,并且默认情况下 mean 和类似方法会忽略这些值。

    【讨论】:

      【解决方案2】:

      您可以使用内四分位范围 (IQR) 进行简单的异常值检测。来自维基百科

      四分位距 (IQR),也称为中间价差或中间 50%,或技术上的 H 价差,是统计离散度的量度,等于第 75 和第 25 个百分位数之间的差异,或上四分位数和下四分位数之间的差异, IQR = Q3 - Q1。 换句话说,IQR 是从第三个四分位数减去第一个四分位数;这些四分位数可以在数据的箱形图上清楚地看到。 它是一种类似于标准差或方差的离散度度量,但对异常值更加稳健。

      Q1 = data.quantile(0.25)
      Q3 = data.quantile(0.75)
      IQR = Q3 - Q1
      print(IQR)
      if(data[i] < (Q1 - 1.5 * IQR)) |(data[i] > (Q3 + 1.5 * IQR))
          #outlier detected 
          #do stuff ...
      

      如果数据点位于异常值边界之外,则数据点可能是异常值。因此,在您的情况下,您可以根据逻辑计算每列或所有列的异常值,这取决于您拥有的数据以及它们之间的关系。希望能帮助到你。

      顺便说一句,您可以使用matplotlib boxplot 简单地可视化上述方法。只需传递您正在进行异常值检测的一系列数据,它会直接为您执行并绘制它。 还有其他方法,比如scikit learnoutlier detection 这个blog也很有用。

      【讨论】:

        猜你喜欢
        • 2012-01-13
        • 2018-08-18
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 2022-10-23
        • 2015-03-31
        • 1970-01-01
        相关资源
        最近更新 更多