【问题标题】:Replace outliers with median exept NaN用中位数 exept NaN 替换异常值
【发布时间】:2020-05-02 18:40:35
【问题描述】:

我想用数据框中的中值替换异常值,但只有异常值而不是 NaN。

第一:

      January  February 
0      -5.0     -7.0 
1      -6.0     -6.0 
2      -5.0     -5.0  
3      -3.0     -6.0 
4      -6.0     -8.0   
5     -11.0     -9.0    
6      -6.0      5.0    
7      -8.0    -11.0  
8     -11.0    -12.0  
9      -8.0     -9.0     
10     -8.0     -6.0   
11     -8.0     -5.0    
12     -8.0     -4.0   
13    -10.0      1.0    
14    -10.0      3.0   
15     -9.0     -9.0    
16     -6.0     -6.0   
17     -6.0     -6.0   
18     -4.0     -4.0  
19     -8.0      2.0    
20     -9.0      3.0      
21    -14.0      1.0 
22    -15.0     -3.0  
23    -17.0     -4.0   
24    -19.0     -6.0     
25    -60.0     -8.0   
26     -8.0     -8.0   
27     -9.0    -11.0    
28     -5.0      NaN    
29     -6.0      NaN    
30     -7.0      NaN 

我想用中位数替换离群值 -60:

df = df[df.apply(lambda x: np.abs(x - x.mean()) / x.std() < 4).all(axis=1)]

它工作正常,但它也删除了所有包含 NaN 的行我怎样才能避免这种情况?

输出:

  January  February 
0      -5.0     -7.0 
1      -6.0     -6.0 
2      -5.0     -5.0  
3      -3.0     -6.0 
4      -6.0     -8.0   
5     -11.0     -9.0    
6      -6.0      5.0    
7      -8.0    -11.0  
8     -11.0    -12.0  
9      -8.0     -9.0     
10     -8.0     -6.0   
11     -8.0     -5.0    
12     -8.0     -4.0   
13    -10.0      1.0    
14    -10.0      3.0   
15     -9.0     -9.0    
16     -6.0     -6.0   
17     -6.0     -6.0   
18     -4.0     -4.0  
19     -8.0      2.0    
20     -9.0      3.0      
21    -14.0      1.0 
22    -15.0     -3.0  
23    -17.0     -4.0   
24    -19.0     -6.0     
25    -10.0     -8.0   
26     -8.0     -8.0   
27     -9.0    -11.0

如您所见,删除了 3 行,不太方便。有任何想法吗 ?谢谢!

【问题讨论】:

    标签: python pandas numpy dataframe outliers


    【解决方案1】:

    您可以在逻辑中使用.isna()

    df = df[df.apply(lambda x: (np.abs(x - x.mean()) / x.std() < 4) | x.isna()).all(axis=1)]
    print(df)
    

    打印(注意索引 25 (-60.0) 丢失:

          January  February
    0        -5.0      -7.0
    1        -6.0      -6.0
    2        -5.0      -5.0
    3        -3.0      -6.0
    4        -6.0      -8.0
    5       -11.0      -9.0
    6        -6.0       5.0
    7        -8.0     -11.0
    8       -11.0     -12.0
    9        -8.0      -9.0
    10       -8.0      -6.0
    11       -8.0      -5.0
    12       -8.0      -4.0
    13      -10.0       1.0
    14      -10.0       3.0
    15       -9.0      -9.0
    16       -6.0      -6.0
    17       -6.0      -6.0
    18       -4.0      -4.0
    19       -8.0       2.0
    20       -9.0       3.0
    21      -14.0       1.0
    22      -15.0      -3.0
    23      -17.0      -4.0
    24      -19.0      -6.0
    26       -8.0      -8.0
    27       -9.0     -11.0
    28       -5.0       NaN
    29       -6.0       NaN
    30       -7.0       NaN
    

    【讨论】:

      【解决方案2】:

      使用numpy.where(...)

      df[["January", "February"]]=\
          np.where(
              df.sub(df.mean(axis=0)).abs()\
              .div(df.std(axis=0))>=4, 
              df.median(axis=0), df
          )
      

      输出:

          January  February
      0      -5.0      -7.0
      1      -6.0      -6.0
      2      -5.0      -5.0
      3      -3.0      -6.0
      4      -6.0      -8.0
      5     -11.0      -9.0
      6      -6.0       5.0
      7      -8.0     -11.0
      8     -11.0     -12.0
      9      -8.0      -9.0
      10     -8.0      -6.0
      11     -8.0      -5.0
      12     -8.0      -4.0
      13    -10.0       1.0
      14    -10.0       3.0
      15     -9.0      -9.0
      16     -6.0      -6.0
      17     -6.0      -6.0
      18     -4.0      -4.0
      19     -8.0       2.0
      20     -9.0       3.0
      21    -14.0       1.0
      22    -15.0      -3.0
      23    -17.0      -4.0
      24    -19.0      -6.0
      25     -8.0      -8.0
      26     -8.0      -8.0
      27     -9.0     -11.0
      28     -5.0       NaN
      29     -6.0       NaN
      30     -7.0       NaN
      

      【讨论】:

        猜你喜欢
        • 2016-06-25
        • 2021-02-27
        • 2022-10-05
        • 2018-07-12
        • 2021-09-16
        • 2021-06-22
        • 2021-03-02
        • 2021-04-13
        • 2018-03-16
        相关资源
        最近更新 更多