我尝试使用Scikit-Learn的OneHotEncoder将包含字符串的Pandas DataFrame中的一列替换为one-hot编码的等价物。
from sklearn.preprocessing import OneHotEncoder
# data is a Pandas DataFrame
jobs_encoder = OneHotEncoder()
jobs_encoder.fit(data['Profession'].unique().reshape(1, -1))
data['Profession'] = jobs_encoder.transform(data['Profession'].to_numpy().reshape(-1, 1))
它会产生以下错误(忽略列表中的字符串):
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-91-3a1f568322f5> in <module>()
3 jobs_encoder = OneHotEncoder()
4 jobs_encoder.fit(data['Profession'].unique().reshape(1, -1))
----> 5 data['Profession'] = jobs_encoder.transform(data['Profession'].to_numpy().reshape(-1, 1))
/usr/local/anaconda3/envs/ml/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py in transform(self, X)
730 copy=True)
731 else:
--> 732 return self._transform_new(X)
733
734 def inverse_transform(self, X):
/usr/local/anaconda3/envs/ml/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py in _transform_new(self, X)
678 """New implementation assuming categorical input"""
679 # validation of X happens in _check_X called by _transform
--> 680 X_int, X_mask = self._transform(X, handle_unknown=self.handle_unknown)
681
682 n_samples, n_features = X_int.shape
/usr/local/anaconda3/envs/ml/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py in _transform(self, X, handle_unknown)
120 msg = ("Found unknown categories {0} in column {1}"
121 " during transform".format(diff, i))
--> 122 raise ValueError(msg)
123 else:
124 # Set the problematic rows to an acceptable value and
ValueError: Found unknown categories ['...', ..., '...'] in column 0 during transform
以下是一些示例数据:
data['Profession'] =
0 unkn
1 safe
2 rece
3 unkn
4 lead
...
111988 indu
111989 seni
111990 mess
111991 seni
111992 proj
Name: Profession, Length: 111993, dtype: object
我到底做错了什么?
6条答案
按热度按时间szqfcxe21#
OneHotEncoder将分类整数功能编码为单热值数值数组。如果
sparse=True
,则其Transform方法返回稀疏矩阵,否则返回二维数组。您不能将二维数组(或稀疏矩阵)转换为Pandas系列。您必须为每个类别创建一个Pandas系列(Pandas数据框中的一列)。
我推荐使用pandas.get_dummies:
使用Sklearn OneHotEncoder:
lg40wkob2#
结果Scikit-Learns LabelBinarizer在将数据转换为one-hot编码格式方面给了我更好的运气,在Amnie's solution的帮助下,我的最终代码如下所示
gev0vcfq3#
以下是Kaggle Learn建议的一种方法,不要认为现在有更简单的方法可以从原始的Pandas
DataFrame
转换为一个one-hot编码的DataFrame
。8cdiaqws4#
这就可以了。如果你不感兴趣的话,可以去掉plotly部分。如果你不需要markdown,也可以把printmd改成print。
qhhrdooz5#
我将@IndreshKumar的解决方案封装到一个sklearn转换器中:
示例:给定具有两个分类列的数据框:
输出如下所示:
wfveoks06#
得益于scikit-learn的新
set_output
API,现在可以在应用OneHotEncoder后获得Dataframe输出。请参考:https://scikit-learn.org/stable/auto_examples/miscellaneous/plot_set_output.html