代码之家  ›  专栏  ›  技术社区  ›  user_01

通过过滤单个列从数据帧中删除异常值

  •  0
  • user_01  · 技术社区  · 6 年前

    我有一个这样的数据框:

    A    B   C  
    1   10   121
    5    6   122  
    7    8   123  
    9   10   124  
    12  23   125
    10  24   1500 
    13  36   1600
    

    通过对c列应用mean++2std.deviation方法,我希望从c中删除异常值并过滤数据帧,在这里我最终希望得到

    A    B    C  
    1   10   121
    5    6   122  
    7    8   123  
    9   10   124  
    12  23   125  
    

    这是我的代码:

    target=df['C']
    mean = target.mean()
    sd = target.std()
    lower_boundary = [x for x in target if (x < mean - 2 * sd)]
    upper_boundary=  [x for x in target if (x > mean - 2 * sd)]
    
    selected_df=df[(target==lower_boundary) & (target==upper_boundary)]
    selected_df
    

    但它显示

    TypeError: invalid type comparison
    

    错误。你能告诉我哪里出错了吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Graipher    6 年前

    只需对目标列执行操作,即可获得布尔序列而不是单个布尔值:

    target = df['C']
    mean = target.mean()
    sd = target.std()
    selected_df = df[(target > mean - 2*sd) & (target < mean + 2*sd)]
    

    注意,我修复了 - 到A + . 还要注意的是,由于平均值约为530,标准差约为700,这实际上并没有删除任何内容(平均值受到异常值强烈影响的一个很好的例子)。

        2
  •  1
  •   Owen    6 年前

    我认为问题是:

    (target==lower_boundary) & (target==upper_boundary)

    这将计算为布尔值,因为您正在执行 bitwise and 两个布尔值。

    然后尝试使用布尔键索引数据帧,但失败。