我正在使用以下数据框,如何对city
进行分组,并仅在num1
和num2
的每一列中删除离群值, 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_iqr
和def 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
谢谢您的帮助。
与参考相关:
答案 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]