如何用大熊猫按顺序对多个类别(多行)进行标签编码?

时间:2019-02-26 10:57:58

标签: python pandas encoding scikit-learn

我有一个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名称以更好地显示错误

1 个答案:

答案 0 :(得分:0)

是的,正如您提到的,labelencoder确实对internally进行了排序。 如果您想按自己喜欢的顺序进行编码。 然后试试这个!

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]))