#python #pandas #scikit-learn
Вопрос:
Панды == 1.2.3
склеарн == 0.24.2
Попытка преобразовать несколько двоичных столбцов в 1/0 с помощью порядкового кодера, а затем изменить их тип данных на «int8»
MRE:
df = pd.DataFrame({"A":["True", "False", "True", "False", "False"],
"B":["Yes", "No", "Yes", "Yes", "Yes"],
"C":[1, 4, 1, 4, 4]})
Выполнение следующего преобразует тип данных в «integer64» и в «float16» в «float64».
bin_cols = ["A", "B", "C"]
df[bin_cols] = OrdinalEncoder()
.fit_transform(df[bin_cols])
.astype('int8')
df.dtypes
>>> A int64
>>> B int64
>>> C int64
Если я достану его и выступлю
df[bin_cols].astype('int8').dtypes
>>> A int8
>>> B int8
>>> C int8
Он правильно преобразуется в «целое число 8».
В чем может быть проблема?
РЕДАКТИРОВАТЬ: Если я дважды запускаю 2-й блок кода, он работает…
Комментарии:
1. Я не могу воспроизвести это. Пожалуйста, предоставьте некоторые примеры данных
2. В моем Jupyter это было
int8
!, Однако я думаю, что это тоже сработало бы:astype(np.int8)
3. @ashkangh с первой попытки? Если вы запустите его повторно, он сработает, однако не при первом запуске.
4. Такое поведение невозможно воспроизвести в
pandas 1.3.2
иscikit-learn 0.24.2
5. Нет, я не имел в виду, что ваш код не воспроизводим, поведение -нет. Этот код, выполняемый в чистой рабочей области с вышеперечисленными версиями, каждый раз создает 3 столбца, все из
int8
которых имеют одинаковый тип, включая первый.