我在尝试对一个数据框架进行独热编码以进行一些测试。
我尝试使用 sklearn
中的常规 OneHotEncoder
,但它似乎在处理 NaN
值时有一些问题(这些 NaN
值不在我想要编码的列中)。
根据我的搜索,解决方案是使用列转换器,它可以只对某些列应用编码,类似于以下内容:
ct = ColumnTransformer([(OneHotEncoder(categories = categories_list),['col1','col2','col3'])])
其中 categories_list
是所有现有类别的列表。
问题是当我尝试将这个转换器应用到我的数据框架时,我总是得到 not enough values to unpack
错误。
我这样转换:
ct.fit_transform(df_train_xgboost)
有什么建议吗?
编辑:
一些示例数据
id | col1 | col2 | col3 | price | has_something1 blue car new 23781 NaN2 green truck used 24512 13 red van new 44521 0
更多代码
categories_list = ['blue','green','red','car','truck','van','new','used']df_train_xgboost = df_traindf_train_xgboost = df_train_xgboost.drop(columns_I_dont_want, axis=1)df_train_xgboost = df_train_xgboost.fillna(value = {'col1': 0, 'col2': 0, 'col3': 0})ct = ColumnTransformer([(OneHotEncoder(categories = categories_list),['col1','col2','col3'])])print(df_train_xgboost.shape)ct.fit_transform(df_train_xgboost)
回答:
首先,使用 ColumnTransformer
并不是必须的。
-
为了使您的代码工作,您需要一个额外的输入参数,即转换器的“名称”。
完整示例:
df col1 col2 col30 blue car new1 green truck used2 red van newct = ColumnTransformer([("onehot",OneHotEncoder(),[0,1,2])])ct.fit_transform(df.values)array([[1., 0., 0., 1., 0., 0., 1., 0.], [0., 1., 0., 0., 1., 0., 0., 1.], [0., 0., 1., 0., 0., 1., 1., 0.]])
- 现在请注意,您只使用
OneHotEncoder
就能得到相同的结果:
o = OneHotEncoder()o.fit_transform(df).toarray()array([[1., 0., 0., 1., 0., 0., 1., 0.], [0., 1., 0., 0., 1., 0., 0., 1.], [0., 0., 1., 0., 0., 1., 1., 0.]])