我有一个名为bids_data的数据框
bids_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
,我想从shiper_RFQ中删除异常行并将其存储在另一个数据框中。我尝试将shiper_RFQ转换为列表,然后找到异常值,但效果不佳。
答案 0 :(得分:1)
您可以通过查找与平均列值相差超过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
答案 1 :(得分:1)
如果您有良好的数据,请使用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