【问题标题】:How to label encode multiple categories (multiple rows) in order with pandas?如何用熊猫按顺序标记编码多个类别(多行)?
【发布时间】:2019-07-19 21:40:41
【问题描述】:

我有一个 pandas 数据框(在 python 中),我想标记编码两列,准备在其上训练机器学习模型。将其从分类数据转换为数字。 (我现在还不希望 OneHotEncode 数据)


我有一个与此类似的数据(一旦订购)的数据框:

Main_Category    Sub_Category
Cat_0            Sub_1
Cat_1            Cub_1
Cat_1            Aub_2
Cat_2            Sub_3

数据遵循以下关系,其中一个主类别可以有许多独特的子类别。我想先按 Main_Category 排序数据帧,然后按 Sub_Category。这会将所有子类别按其主要类别组合在一起。

df = df.sort_values(['Main_Category', 'Sub_Category'], ascending=[True, True])

然后我想对数据进行编码,使其看起来像这样:

Main_Category    Sub_Category
0                0
1                1
1                2
2                3

但是,当我对数据进行编码时,我得到的编码是这样的:

Main_Category    Sub_Category
0                2
1                0
1                1
2                3

我相信编码库正在对数据本身进行排序,然后根据这些结果进行编码。我希望它根据我自己的排序进行编码。什么是理想的解决方案?

这是对列进行编码的代码:

from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
df['Main_Category'] = labelencoder.fit_transform(df['Main_Category'])
labelencoder = LabelEncoder()
df['Sub_Category'] = labelencoder.fit_transform(df['Sub_Category'])

编辑:我无法显示真实数据,这就是为什么我的问题有虚拟数据。 编辑:更新了 sub_category 名称以更好地显示错误

【问题讨论】:

  • 不要对不同的列使用相同的labelencoder。这将覆盖它之前学到的东西。实例化 LabelEncoder 的次数与您要编码的列一样多。
  • 感谢您的意见,克里斯。我已经更新了我的问题以反映这一点。虽然这是我的代码中的错误,但结果仍然是不受欢迎的。我相信,当您为 sklearn 库提供要编码的数组时,它会自行对其进行排序(撤消我的排序),然后返回标签。
  • 您的编辑版本仍然相同。您正在分配给同一个变量,覆盖以前的LabelEncoder。试试le1, le2, ...
  • 至于真正的问题,我无法重现。你能用给定的示例数据重现它吗?
  • 我已通过重命名子类别来更新问题。使用此数据和显示的相同代码,我仍然会得到不希望的结果。重命名标签编码器没有任何影响。

标签: python pandas encoding scikit-learn


【解决方案1】:

是的,正如您提到的,labelencoderinternally 进行排序。 如果您想让编码按特定顺序发生,请使用_encode 直接地。

from sklearn.preprocessing.label import _encode

unique_main_cat, ind = np.unique(df.Main_Category, return_index=True) 

# unique_main_cat would have sorted unique values,  
# to get the original order use argmin(ind)

_encode(df['Main_Category'], 
        uniques=unique_main_cat[np.argsort(ind)], 
        encode=True)

# (array(['Cat_0', 'Cat_1', 'Cat_2'], dtype=object), array([0, 1, 1, 2]))



unique_sub_cat, ind = np.unique(df.Sub_Category, return_index=True)
_encode(df['Sub_Category'], 
        uniques=unique_sub_cat[np.argsort(ind)], 
        encode=True)

# (array(['Sub_1', 'Aub_2', 'Cub_1', 'Sub_3'], dtype=object), array([0, 1, 2, 3]))

【讨论】:

  • 您好,感谢您的回答。尝试导入该库时出现错误。我尝试导入 LabelEncoder ,但这不适用于此代码?
  • 如果您将 sklearn 版本升级到 0.20,我认为它会起作用。否则,你能分享你的错误信息吗
猜你喜欢
  • 2020-02-01
  • 1970-01-01
  • 2018-05-30
  • 2022-11-25
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
相关资源
最近更新 更多