我在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