У вас проблемы с кодом, потому что вы пытаетесь вычислить 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
Кроме того, вы можете рассмотреть еще один подход для работы с выбросами с пандами.DataFrame.clip , который будет обрезать выбросы в каждом конкретном случае, а не отбрасывать строку целиком.