Sta*_*rák 2 python numpy scipy pandas
我想从我的数据集“train”中删除异常值,为此我决定使用 z-score 或 IQR。
我在 Microsoft Python Client for SQL Server 上运行 Jupyter notebook。
我试过 z-score:
from scipy import stats
train[(np.abs(stats.zscore(train)) < 3).all(axis=1)]
Run Code Online (Sandbox Code Playgroud)
对于 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)]
Run Code Online (Sandbox Code Playgroud)
...返回...
对于 z 分数:
类型错误:不支持 / 的操作数类型:'str' 和 'int'
对于 IQR:
类型错误:无法排序的类型:str() < float()
我的火车数据集如下所示:
# Number of each type of column
print('Training data shape: ', train.shape)
train.dtypes.value_counts()
Run Code Online (Sandbox Code Playgroud)
训练数据形状:(300000, 111) int32 66 float64 30 object 15 dtype: int64
帮助将不胜感激。
您在使用代码时遇到问题,因为您正在尝试zscore对分类列进行计算。
为了避免这种情况,您应该首先将您的火车分成具有数字和分类特征的部分:
num_train = train.select_dtypes(include=["number"])
cat_train = train.select_dtypes(exclude=["number"])
Run Code Online (Sandbox Code Playgroud)
并且仅在此之后计算要保留的行索引:
idx = np.all(stats.zscore(num_train) < 3, axis=1)
Run Code Online (Sandbox Code Playgroud)
最后将这两部分加在一起:
train_cleaned = pd.concat([num_train.loc[idx], cat_train.loc[idx]], axis=1)
Run Code Online (Sandbox Code Playgroud)
对于 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)
Run Code Online (Sandbox Code Playgroud)
如果您有任何其他问题,请告诉我们。
聚苯乙烯
同样,您可能会考虑使用pandas.DataFrame.clip处理异常值的另一种方法,它将根据具体情况裁剪异常值,而不是完全删除一行。
| 归档时间: |
|
| 查看次数: |
14511 次 |
| 最近记录: |