我在处理泰坦尼克号数据集时,尝试对名为 ‘Embarked’ 的列进行独热编码,该列有三个可能的值 ‘S’、’Q’ 和 ‘C’。然而,这引发了以下错误:
ValueError: Input contains NaN
我使用两种方法检查了该列的内容。第一种方法是使用 for 循环和 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)
结果显示:
EmbarkedS 518C 139Q 55Name: 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 值呢?
回答:
我已经弄明白了,ColumnTransformer 会将转换结果拼接起来,而不是将它们传递给下一个转换器。因此,fill_pipeline 中的任何转换都不会被 OneHotEncoder 注意到,因为它仍然在处理未转换的数据集。所以我必须将独热编码放入 fill_pipeline,而不是 ColumnTransformer 中。
full_pipeline = ColumnTransformer([ ("fill",fill_pipeline,list(strat_train_set)), ("emb_cat",OneHotEncoder(),['Sex']), ("cat",OneHotEncoder(),['Embarked']),])