普通编码器和保持NAN

2024-10-01 22:39:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个2d numpy阵列,它是通过以下方式创建的:

array = dataset.to_numpy()
X = array[:, 1:]

我想使用OrdinalEncoder,但在X中有一些NaN我想估算。我不能运行OrdinalEncoder,因为它不喜欢NAN,而且在编码之前我不能运行KNI计算机

我知道我可以用诸如“?”之类的东西来替换Nan,然后OrdinalCoder()就可以工作了,但是我必须遍历并替换“?”变成Nan的数字。这意味着循环遍历OrdinalCoder内部,找出每列中的“?”映射到了什么,然后对该列进行替换

难道没有更好的办法吗?我试着让掩蔽工作,但没办法。我需要对X进行操作,而不是对数据集进行操作


Tags: tonumpy编码计算机方式数字nanarray
2条回答

如果您不再需要编码器,那么可以使用pd.factorize,它将所有np.nan转换为-1,您需要将其放回np.nan

import pandas as pd
import numpy as np
from sklearn.preprocessing import OrdinalEncoder

X = pd.DataFrame({'x1':['a','b',np.NaN],'x2':[np.NaN,'c','d']})

    x1   x2
0    a  NaN
1    b    c
2  NaN    d

X.apply(lambda x:x.factorize()[0]).replace(-1,np.nan)

    x1   x2
0  0.0  NaN
1  1.0  0.0
2  NaN  1.0

对于注释来说太长了,但是如果您不介意复制的话,您可以将NaN临时移出数组

array = dataset.to_numpy()
X = array[:, 1:]

nan_free_mask = ~np.isnan(X)
nan_free_X = X[nan_free_mask]

nan_free_encoded = OrdinalEncoder.fit_transform(nan_free_X, ...)
X_encoded = X.copy()
X_encoded[nan_free_mask] = nan_free_encoded
X_encoded = KNNImputer(...).fit_transform(X_encoded)

你用?替换nan的想法也没有错。你只需要记住它发生在哪里。据我所知,OrdinalCoder不会对您的数据进行洗牌,但我可能错了:

array = dataset.to_numpy()
X = array[:, 1:]

nan_mask = np.isnan(X)
X[nan_mask] = '?'
X_encoded = OrdinalEncoder.fit_transform(X, ...)
X_encoded[nan_mask] = np.nan  # restore NaN
X_encoded = KNNImputer(...).fit_transform(X_encoded)

再说一次,你可能已经想到了。。。如果是,请更新问题并指定您尝试过的内容

相关问题 更多 >

    热门问题