OneHotEncoder выдает ValueError: ввод содержит NaN; хотя мой DataFrame не содержит NaN, как указано df.isna () - PullRequest
1 голос
/ 14 июля 2020

Я работаю с набором данных titani c и пытаюсь применить OneHotEncoding к одному из столбцов под названием «Embarked», который имеет 3 возможных значения «S», «Q» и «C». Это дает мне

ValueError: Input contains NaN

. Я проверил содержимое столбца двумя способами. Первый - for-l oop с value_counts, а второй - путем записи всей таблицы в csv:

for col in X.columns:
    print(col)
    print(X[col].value_counts(dropna=False))
X.isna().to_csv("xisna.csv")
print("notna================== :",X.notna().shape)
X.dropna(axis=0,how='any',inplace=True)
print("X.shape " ,X.shape)
return pd.DataFrame(X)

Что дало

Embarked
S    518
C    139
Q     55
Name: Embarked, dtype: int64

Я проверил содержимое csv и прочитав более 700 записей, я не нашел ни одного оператора True.

Конвейер, блокирующий ("cat", One ...)

cat_attribs=["Sex","Embarked"]
special_attribs = {'drop_attribs' : ["Name","Cabin","Ticket","PassengerId"], k : [3]}

full_pipeline = ColumnTransformer([
    ("fill",fill_pipeline,list(strat_train_set)),
    ("emb_cat",OneHotEncoder(),['Sex']),
    ("cat",OneHotEncoder(),['Embarked']),
])

Так где именно значение NaN, которое мне не хватает?

1 Ответ

0 голосов
/ 15 июля 2020

Я понял, ColumnTransformer объединит преобразования вместо того, чтобы передавать их следующему преобразователю в строке. Таким образом, любые преобразования, выполненные в fill_pipeline, не будут замечены OneHotEncoder, поскольку он все еще работает с нетрансформированным набором данных. Поэтому мне пришлось поместить одну горячую кодировку в fill_pipeline вместо ColumnTransformer.

full_pipeline = ColumnTransformer([
    ("fill",fill_pipeline,list(strat_train_set)),
    ("emb_cat",OneHotEncoder(),['Sex']),
    ("cat",OneHotEncoder(),['Embarked']),
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...