从某一列中删除异常值

2024-06-13 20:51:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧的名字叫

投标资料:

  Supplier_ID  shiper_RFQ
----------
0    2305      5000
1    2309      5200
2    2305      6500 
3    2307      4500
4    2301      900
5    2302      10000
6    2306      4500

我想从shipper\u RFQ中删除离群值行,并将它们存储在另一个数据帧中。我尝试在列表中转换shipper\u RFQ,然后找到异常值,但效果不好。你知道吗


Tags: 数据id列表名字supplier投标离群效果
2条回答

如果你有好的数据,那么就用threshold = 0.5

threshold = 1
print(df[df['shiper_RFQ'].apply(lambda x: np.abs(x - df['shiper_RFQ'].mean()) / df['shiper_RFQ'].std() < threshold)])

还有这个

 df = df[ np.abs(df['shiper_RFQ'] - df['shiper_RFQ'].mean()) / df['shiper_RFQ'].std() < threshold]

两者的结果相同

输出

   Supplier_ID  shiper_RFQ
0         2305        5000
1         2309        5200
2         2305        6500
3         2307        4500
6         2306        4500

如果你打印你可以看到异常

print(df['shiper_RFQ'].apply(lambda x: np.abs(x - df['shiper_RFQ'].mean()) / df['shiper_RFQ'].std()))

0    0.084182
1    0.010523
2    0.468261
3    0.268329
4    1.594192
5    1.757294
6    0.268329

您可以通过查找与平均列值相差超过1.5个标准差(或您选择的任何其他截止值)的行来识别异常值:

df['outliers'] = 0
df.loc[(df.shiper_RFQ - df.shiper_RFQ.mean()).abs() > 1.5*df.shiper_RFQ.std(), 'outliers'] = 1
print(df)
   Supplier_ID  shiper_RFQ  outliers
0         2305        5000         0
1         2309        5200         0
2         2305        6500         0
3         2307        4500         0
4         2301         900         1
5         2302       10000         1
6         2306        4500         0

然后可以将它们存储在另一个数据帧中,并从原始数据帧中删除它们:

df2 = df[df.outliers == 1].reset_index(drop=True)
df = df[df.outliers == 0].reset_index(drop=True)
print(df2)
print(df)
   Supplier_ID  shiper_RFQ  outliers
0         2301         900         1
1         2302       10000         1

   Supplier_ID  shiper_RFQ  outliers
0         2305        5000         0
1         2309        5200         0
2         2305        6500         0
3         2307        4500         0
4         2306        4500         0

相关问题 更多 >