如何删除Python中的异常值?

2024-06-11 06:58:33 发布

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

我想从我的数据集“train”中删除异常值,为此我决定使用z-score或IQR。

我正在MicrosoftPythonClientforSQL服务器上运行Jupyter笔记本。

我试过z-score:

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-score:

TypeError: unsupported operand type(s) for /: 'str' and 'int'

对于IQR:

TypeError: unorderable types: str() < float()

我的火车数据集看起来像:

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

Training data shape: (300000, 111) int32 66 float64 30 object 15 dtype: int64

我们将非常感谢您的帮助。


Tags: of数据statstypetrainingtrainscoreshape
1条回答
网友
1楼 · 发布于 2024-06-11 06:58:33

您的代码有问题,因为您试图计算分类列上的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)

如果您还有任何问题,请告诉我们。

聚苯乙烯

另外,您还可以考虑使用pandas.DataFrame.clip处理异常值的另一种方法,这种方法将逐个剪裁异常值,而不是完全删除一行。

相关问题 更多 >