分组并删除Python中的异常值

时间:2019-08-21 08:41:54

标签: python pandas

我正在使用以下数据框,如何对city进行分组,并仅在num1num2的每一列中删除离群值num1中的示例离群值,例如9473, 9450, 9432的{​​{1}}和bj的{​​{1}}?谢谢。

7200, 5600

到目前为止,我已经尝试了两种方法:

方法1:

首先,我定义sh函数来检测和过滤极高的值:

      id address  num1   num2
0   1001      bj  9473      0
1   1002      bj  9450    189
2   1003      bj  9432   1574
3   1004      bj  4010   4802
4   1005      bj  3910  30747
5   1006      bj  3808  45373
6   1007      bj  3384  48846
7   1008      bj  3315  11377
8   1009      bj  2679  33207
9   1010      bj  2485  21483
10  1011      bj  2436  42125
11  1012      bj  2382  11034
12  1013      bj  1698  44503
13  1014      bj  1657  18383
14  1015      bj  1603  28072
15  1016      bj  1557   8427
16  1017      bj  1541  29578
17  1018      bj  1494  23471
18  1019      sh  7200  14691
19  1020      sh  5600  20321
20  1021      sh  1383   2152
21  1022      sh  1321  24152
22  1023      sh  1295   6770
23  1024      sh  1292   6173
24  1025      sh  1236  18965
25  1026      sh  1223  31745
26  1027      sh  1209      0
27  1028      sh  1196   4206
28  1029      sh  1182  14530
29  1030      sh  1165  15300
30  1031      sh  1162  22701
31  1032      sh  1143  36859
32  1033      sh  1130  23382
33  1034      sh  1129  29679
34  1035      sh  1117   3388
35  1036      sh  1066  39502
36  1037      sh  1066  24099
37  1038      sh  1036   3617

然后我需要将该函数应用于列outlier_iqrdef outliers_iqr(ys): Q1, Q3 = np.percentile(ys, [1, 99]) iqr = Q3 - Q1 # lower_bound = Q1 - (iqr * 1.5) # not necessary since only detect upper outliers upper_bound = Q3 + (iqr * 1.5) # return np.where((ys > upper_bound) | (ys < lower_bound)) return np.where((ys > upper_bound)) 并写入excel:

num1

方法2 ,该方法尚不可用:

num2

谢谢您的帮助。

与参考相关:

Remove outliers in Pandas dataframe with groupby

1 个答案:

答案 0 :(得分:3)

我相信您需要:

f = lambda x : (x<x.quantile(0.99))
mask = df.groupby("address")['num1', 'num2'].transform(f).all(axis=1)

#test removed rows
df2 = df[~mask]
print (df)
      id address  num1   num2
0   1001      bj  9473      0
6   1007      bj  3384  48846
18  1019      sh  7200  14691
35  1036      sh  1066  39502

#remove rows
df1 = df[mask]