如何在Python中删除离群值?

时间:2019-01-28 09:06:41

标签: python pandas numpy scipy

我想从我的数据集“火车”中删除离群值,为此,我决定使用z得分或IQR。

我正在SQL Server的Microsoft Python客户端上运行Jupyter笔记本。

我尝试过使用z得分:

from scipy import stats
train[(np.abs(stats.zscore(train)) < 3).all(axis=1)]

对于IQR:

Q1 = train.quantile(0.02)
Q3 = train.quantile(0.98)
IQR = Q3 - Q1
train = train[~((train < (Q1 - 1.5 * IQR)) |(train > (Q3 + 1.5 * 
IQR))).any(axis=1)]

...返回...

z得分:

  

TypeError:/的不支持的操作数类型:“ str”和“ int”

对于IQR:

  

TypeError:不可排序的类型:str()

我的火车数据集如下:

# Number of each type of column
print('Training data shape: ', train.shape)
train.dtypes.value_counts()
  

训练数据形状:(300000,111)int32 66 float64 30 object 15 dtype:int64

我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

因为尝试在分类列上计算zscore,所以您的代码遇到了麻烦。

为避免这种情况,您应该首先将火车分成具有数字和分类特征的部分:

num_train = train.select_dtypes(include=["number"])
cat_train = train.select_dtypes(exclude=["number"])

,仅在此之后计算要保留的行索引:

idx = np.all(stats.zscore(num_train) < 3, axis=1)

最后将这两部分加在一起:

train_cleaned = pd.concat([num_train.loc[idx], cat_train.loc[idx]], axis=1)

对于IQR部分:

Q1 = num_train.quantile(0.02)
Q3 = num_train.quantile(0.98)
IQR = Q3 - Q1
idx = ~((num_train < (Q1 - 1.5 * IQR)) | (num_train > (Q3 + 1.5 * IQR))).any(axis=1)
train_cleaned = pd.concat([num_train.loc[idx], cat_train.loc[idx]], axis=1)

如果您还有其他疑问,请告诉我们。

PS

同样,您可以考虑使用另一种方法来处理pandas.DataFrame.clip的异常值,该方法将根据情况裁剪异常值,而不是将其全部删除。