【发布时间】:2020-11-03 10:49:37
【问题描述】:
我正在处理 Titanic 数据集,并尝试在名为“Embarked”的列之一上应用 OneHotEncoding,该列有 3 个可能的值“S”、“Q”和“C”。 它给了我
ValueError: Input contains NaN
我使用 2 种方法检查了该列的内容。第一个是带有 value_counts 的 for 循环,第二个是通过将整个表写入 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 多个条目,但没有找到任何“真”语句。
在 ("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 值到底在哪里?
【问题讨论】:
-
您使用的是哪个 Titanic 数据集?我尝试在从kaggle competition 下载的
train.csv数据集上使用X['Embarked'].value_counts(dropna=False),我得到了这个结果:S 644 C 168 Q 77 NaN 2 Name: Embarked, dtype: int64。在PassengerId62 和 830 处确实有两个NaN值 -
我直接使用了来自 Kaggle 的那个。我已将数据集拆分为 training_set 和 test_set。并应用另一个函数来填充 NaN。您在我的帖子中看到的摘要完全来自我的训练集,这也是我尝试转换的唯一集。
-
您是否仅在您的火车上尝试过这个?
NaN值是否可能仅在测试集中? -
是的,它只在训练集上,因为记录量是原始集的 0.8 倍,而 csv 包含这些记录量。而且我在自己的打印语句之间看到,在训练集的转换过程中,我发现了 NaN 启动单元并将它们转换为 Non-Nan 值
标签: pandas dataframe machine-learning one-hot-encoding kaggle