我在Pandas中创建以下dataframe:

df=pd.DataFrame(np.array([20,"admin","France",
                             25,"worker","Italy",
                             45,"admin","Norway",
                             30,"sec","EEUU",
                             25,"law",np.NaN,
                             30,"sec","France"]

            ).reshape(6,3))
df.columns=["age","job","country"]

我想执行一个热编码,但不使用get_dummies功能,而是我想使用OneHotEncoder。所以我做了以下代码:

def oneHotEncoding(df):
    ohe=preprocessing.OneHotEncoder(dtype=np.int,sparse=True,handle_unknown="ignore")
    values=pd.DataFrame(ohe.fit_transform(df[["country"]]).toarray())
    df=pd.concat([df,values],axis=1)
    df=df.drop(["country"],1)
    print(df)

问题是当我得到结果时,我会得到类似的结果:

   age  job    0  1  2  3  4
0   20  admin  0  1  0  0  0
1   25  worker 0  0  1  0  0
2   45  admin  0  0  0  1  0
3   30  sec    1  0  0  0  0
4   25  law    0  0  0  0  1
5   30  sec    0  1  0  0  0

我想在结果列中出现类似country_france,country_italy等的内容,我尝试了以下代码:

values=pd.DataFrame(ohe.fit_transform(df[["country"]]).toarray(),columns=["country_"+str(int(i)) for i in range(df.shape[1])])

但它没有给我正确的结果。

此外,纳米值仍然被视为一个国家,它应该只有0。

我该如何解决这些问题?我已经测试了我在这里发现的不同可能性,但没有任何帮助。

谢谢

分析解答

如果您坚持使用OneHotEncoder,那么您的问题是您的稀疏矩阵没有列数据,这些属性实际上存储在您的示例中的ohe上。

使用fit_transform后,您可以从OneHotEncoder上的categories_属性访问类别


ohe = preprocessing.OneHotEncoder(dtype=np.int,sparse=True,handle_unknown="ignore")

data = ohe.fit_transform(df[['country']])

values = pd.DataFrame(data.A, columns='country_' + ohe.categories_[0])

   country_EEUU  country_France  country_Italy  country_Norway  country_nan
0             0               1              0               0            0
1             0               0              1               0            0
2             0               0              0               1            0
3             1               0              0               0            0
4             0               0              0               0            1
5             0               1              0               0            0