首页 > 解决方案 > Pandas:在 One-Hot 编码中将 NaN 视为看不见的值

问题描述

我有一个训练集,用于构建一些机器学习模型,我需要设置一些代码来预测测试集(我无权访问)。

例如,如果我有一个 DataFrame train,:

    car
0   Audi
1   BMW
2   Mazda

我可以pd.get_dummies用来获得:

   car_Audi car_BMW car_Mazda
0      1       0       0
1      0       1       0
2      0       0       1

调用这个生成的 DataFrame,train_encoded

现在,假设我的testDataFrame 如下所示:

    car
0   Mercedes

我可以用:

pd.get_dummies(test).reindex(columns=train_encoded.columns)

要得到:

   car_Audi car_BMW car_Mazda
0      0       0       0

我怎样才能将NaNs 视为我的列的看不见的值car?也就是说,如果我NaN在我的car专栏中遇到 in test,我想回来:

   car_Audi car_BMW car_Mazda
0      0       0       0

谢谢!

标签: pythonpandas

解决方案


如果您生成了一个filler未出现在 中的字符串,df.car那么,稍微修改一下文在评论中的建议(对于 中'NAN'的字符串的情况df.car),您可以使用

df.car.fillna(filler, inplace=True) 
pd.get_dummies(test).reindex(columns=train_encoded.columns)

如果您可以提前filler访问所有内容,则一种定义方法是通过df.car

filler = '_' + ''.join(df.car.unique())

因为它至少比其中最长的字符串长 1。另一种方法是使用随机字符串

filler = ''.join(random.choice(string.ascii_lowercase) for _ in range(10))

您拥有此类物品的概率小于len(df) / 26 ** 10


推荐阅读