sklearn 和命名列中的单热编码多列

新手上路,请多包涵

我有以下代码来对我拥有的 2 列进行单热编码。

 # encode city labels using one-hot encoding scheme
city_ohe = OneHotEncoder(categories='auto')
city_feature_arr = city_ohe.fit_transform(df[['city']]).toarray()
city_feature_labels = city_ohe.categories_
city_features = pd.DataFrame(city_feature_arr, columns=city_feature_labels)

phone_ohe = OneHotEncoder(categories='auto')
phone_feature_arr = phone_ohe.fit_transform(df[['phone']]).toarray()
phone_feature_labels = phone_ohe.categories_
phone_features = pd.DataFrame(phone_feature_arr, columns=phone_feature_labels)

我想知道的是我如何在 4 行中执行此操作,同时在输出中获得正确命名的列。也就是说,我可以通过在 fit_transform 中包含两个列名称来创建一个正确的单热编码数组,但是当我尝试命名生成的数据框的列时,它告诉我形状之间存在不匹配指数:

 ValueError: Shape of passed values is (6, 50000), indices imply (3, 50000)

对于背景,phone 和 city 都有 3 个值。

     city    phone
0   CityA   iPhone
1   CityB Android
2   CityB iPhone
3   CityA   iPhone
4   CityC   Android

原文由 Python Developer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 669
2 个回答

您快到了…就像您说的那样,您可以直接在 fit_transform 中添加所有要编码的列。

 ohe = OneHotEncoder(categories='auto')
feature_arr = ohe.fit_transform(df[['phone','city']]).toarray()
feature_labels = ohe.categories_

然后您只需要执行以下操作:

 feature_labels = np.array(feature_labels).ravel()

这使您可以根据需要命名列:

 features = pd.DataFrame(feature_arr, columns=feature_labels)

原文由 MaximeKan 发布,翻译遵循 CC BY-SA 4.0 许可协议

该解决方案给出的列名与 pd.get_dummies() 中的列名相同,这在 IMO 中很有用

labels = ['Sex', 'Embarked', 'Pclass']

categorical_data = data[labels]

ohe = OneHotEncoder(categories='auto')

feature_arr = ohe
   .fit_transform(categorical_data)
   .toarray()

ohe_labels = ohe.get_feature_names(labels)

features = pd.DataFrame(
               feature_arr,
               columns=ohe_labels)

原文由 some_newbie 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题