OneHotEncoder-仅编码一些分类变量列

Poe*_*dit 4 python scikit-learn one-hot-encoding

假设我有一个带有以下列名称的pandas数据框:

  • 'age' (例如33、26、51等)
  • 'seniority' (例如“初级”,“高级”等)
  • 'gender' (例如“男”,“女”)
  • '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)
Run Code Online (Sandbox Code Playgroud)

但是然后我得到这个错误

ValueError: could not convert string to float: 'gender'
Run Code Online (Sandbox Code Playgroud)

在线

data = one_hot_encoder.fit_transform(data.values)
Run Code Online (Sandbox Code Playgroud)

但是,我已经明确指定了,categorical_features=[1]因此seniority对于这一热编码,仅应考虑列1()。

如何解决此错误(例如,删除“性别”列除外)?

pandas.get_dummies过去使用过,但没有这个问题。

sac*_*cuL 5

我认为在这种情况下,您应该坚持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
Run Code Online (Sandbox Code Playgroud)

的问题是,sklearnOneHotEncoder需要具有整数作为输入的阵列。但是在数组中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
Run Code Online (Sandbox Code Playgroud)

或者,如果功能名称无关紧要:

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
Run Code Online (Sandbox Code Playgroud)

但是最后,pd.get_dummies这项工作的完成方式要好得多(IMO)

  • 感谢您的回答(支持)。我会稍等一下,看看是否有更好的答案,如果没有,我会打勾您的答案为正确。 (2认同)