让我们假设我有一个带有以下列名称的pandas数据框:
'age'
(例如33、26、51等)'seniority'
(例如,“初级”,“高级”等)'gender'
(例如“ male”,“ female”)'salary'
(例如32000、40000、64000等)我想将seniority
分类变量转换为一个热编码值。因此,我正在执行以下操作:
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])
from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(categorical_features=[1])
data = one_hot_encoder.fit_transform(data.values)
但是然后我得到了这个错误
ValueError: could not convert string to float: 'gender'
在线
data = one_hot_encoder.fit_transform(data.values)
但是,我已经明确指定了categorical_features=[1]
,因此对于这种热编码,仅应考虑列1(seniority
)。
如何解决此错误(例如,删除“性别”列除外)?
我过去使用过pandas.get_dummies
,但没有遇到这个问题。
答案 0 :(得分:1)
我认为在这种情况下,您应该坚持使用pd.get_dummies
:
>>> data
age seniority gender salary
0 1 junior male 5
1 2 senior female 6
2 3 junior female 7
# One hot encode with get_dummies
data = pd.concat((data,pd.get_dummies(data.seniority)),1)
>>> data
age seniority gender salary junior senior
0 1 junior male 5 1 0
1 2 senior female 6 0 1
2 3 junior female 7 1 0
问题是sklearn
的{{1}}需要有一个整数数组作为输入。但是在数组OneHotEncoder
中,您仍然具有data.values
的字符串表示形式。如果需要,您可以仅对一个优先级值进行一次热编码,但是如果您想知道这些功能的含义,那就不太好了,您必须手动将其传递给列名(在许多情况下这是不可行的) ):
gender
或者,如果功能名称无关紧要:
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])
from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse=False)
data[['junior','senior']] = one_hot_encoder.fit_transform(data['seniority'].values.reshape(-1,1))
>>> data
age seniority gender salary junior senior
0 1 0 male 5 1.0 0.0
1 2 1 female 6 0.0 1.0
2 3 0 female 7 1.0 0.0
但是最后,from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])
from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse=False)
data = pd.concat((data,pd.DataFrame(one_hot_encoder.fit_transform(data['seniority'].values.reshape(-1,1)))),1)
age seniority gender salary 0 1
0 1 0 male 5 1.0 0.0
1 2 1 female 6 0.0 1.0
2 3 0 female 7 1.0 0.0
以更好的方式(IMO)进行了这项工作