Python 从特定列中删除异常值

Python 从特定列中删除异常值,python,python-3.x,dataframe,outliers,Python,Python 3.x,Dataframe,Outliers,我有一个名为bids\u data的数据帧 投标资料: 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_RFQ中删除离群值行,并将它们存储在另一个数据帧中。我尝试在列表

我有一个名为bids\u data的数据帧

投标资料:

  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_RFQ中删除离群值行,并将它们存储在另一个数据帧中。我尝试在列表中转换Shipper_RFQ,然后查找异常值,但效果不佳。

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

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

df2 = df[df.outliers == 1].reset_index(drop=True)
df = df[df.outliers == 0].reset_index(drop=True)
print(df2)
print(df)

如果数据良好,则使用
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)])
如果你打印,你可以看到异常

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

你发现异常值的条件是什么?对于1D,我使用标准偏差/z分数来找到它们。你对你的评论有建设性的解释吗?当我在另一个数据集上尝试时,这并没有给出正确的结果。简单的观察是900outlier@Nathaniel当我给这两个相同的值时,然后它只返回最小的值作为离群值。例如,我给了它9000次,但它没有给9000900次,而是给了900次。这不对吗?这取决于你使用的截止值。如果使用标准偏差的1.5倍作为截止值,则9000不会标记为异常值。如果使用标准偏差的1倍,则它将。
   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
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