首页 > 解决方案 > 如何用熊猫按顺序标记编码多个类别(多行)?

问题描述

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

标签: pythonpandasencodingscikit-learn

解决方案


是的,正如你提到的,内部labelencoder排序。如果您想让编码按特定顺序发生,请 直接使用。_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]))

推荐阅读