利用pandas检测和过滤异常值

利用pandas检测和过滤异常值

在数据清洗过程中,我们经常需要对数据进行检测和过滤异常值。以下是用pandas实现的方法

案例分析:假设我们有某学校学生成绩的数据,学校有ABCD四个班,每个班100名学生,我们需要检测这些数据有没有异常

代码示例:

import numpy as np
import pandas as pd

# 这里我们先随机生成400名学生的成绩
data = pd.DataFrame(np.random.randint(0,101,size = 400).reshape((100,4)),columns = ['A','B','C','D'])

# 我们给这组数据人为传入一些异常值,这里需要注意的是等号右边随机生成的六个数必须用reshape变成二维数组才能存入data中
data.iloc[[0,11,33,55,66,77],[0,1,2,3]] = np.random.randint(101,1000,size = 24).reshape((6,4))

#假设我们现在想要找出A班所有异常值,即成绩不在(0,100]范围内的数据
error_A = data['A']

# 我们先筛选出成绩小于0或大于100的数据,这些便是异常值。这里需要注意的是,(100 < error_A) | (error_A < 0) 和 error_A[(100 < error_A) | (error_A < 0)]  是不同的,第一种会返回布尔值。
error_listA = error_A[(100 < error_A) | (error_A < 0)] 

print('\ndata:')
print(data)
print('\nerror_listA:')
print(error_listA)

#我们来看看结果:
======output:======

data:
      A    B    C    D
0   468  143  776  301
1   100   16   46   58
2    70   38   45   32
3    46   12   20   13
4    13   12   80   13
5     0   95   32   62
6    56   98   43   91
7    12   48   12   63
8    37   89   31   56
9     3   79   93   60
10   84   83   14   71
11  924  978  964  203
12   14   67   75    3
13    9   46   94   14
14   44   18   98    3
15   49   56    8   47
16   86   94   92   75
17   25   80    6   83
18   78   93   99   54
19   91   36   12   70
20   58   33    3   80
21   27   42   70   16
22   68   63   32   16
23    4    8   89   88
24   93   52    5   14
25   49   78   27   69
26   44   58   73   91
27   72   40   68   31
28   73   95   72   45
29   77   46   98   34
..  ...  ...  ...  ...
70   44   51   97   73
71   14   54   15   96
72   39   78   61   85
73    6   86   20   93
74   93   54   86    2
75    6   77   59   93
76   26   67   29   79
77  491  261  456  395
78   72   53   33   36
79   96   60   24   45
80   89   51   82   38
81   24   18   38   61
82   90   49   89   60
83   34   93   76    3
84   31   78   19    9
85   37   97   28   17
86    8   79   73   10
87   43   28   82   77
88   24   86   47   51
89    3   86   68   15
90    4   95   61   89
91   89   74    4   22
92   24    0   42   85
93   51    8   40    9
94   64   65   41   60
95   26   87   57   26
96   84   86   62   32
97   49   19   78   28
98   39   54   24   12
99   43   42   62   45

[100 rows x 4 columns]

error_listA:
0     468
11    924
33    957
55    196
66    516
77    491

#从结果可以看出来,我们已经筛选出了A班所有异常的值。

#假设我们现在想要找出所有班的所有异常值,这里需要注意,加上.any(1)是实现选出data中所有含有异常值的行,如果不加.any(1),会是另一种情况。感兴趣的可以自己尝试
error = data[((100 < data) | (data < 0)).any(1)]

print('\nerror:')
print(error)

# 我们来看看结果
======output:======

error:
      A    B    C    D
0   314  425  300  763
11  984  624  623  252
33  997  102  774  515
55  163  117  497  666
66  408  616  518  756
77  248  674  220  879

# 假如我们还想要对这些成绩进行排名,比如排名A班的成绩。可以用下面方法实现
rank_list = data['A'].sort_values(axis=0,ascending=True)

你可能感兴趣的:(数据分析)