python 使用OrdinalEncoder转换分类值

kmpatx3s  于 2023-02-28  发布在  Python
关注(0)|答案(3)|浏览(229)

我有一个数据集,其中包含以下列:

No  Name  Sex  Blood  Grade  Height  Study
1   Tom   M    O      56     160     Math
2   Harry M    A      76     192     Math
3   John  M    A      45     178     English
4   Nancy F    B      78     157     Biology
5   Mike  M    O      79     167     Math
6   Kate  F    AB     66     156     English
7   Mary  F    O      99     166     Science

我想把它改成这样:

No  Name  Sex  Blood  Grade  Height  Study
1   Tom   0    0      56     160     0
2   Harry 0    1      76     192     0
3   John  0    1      45     178     1
4   Nancy 1    2      78     157     2
5   Mike  0    0      79     167     0
6   Kate  1    3      66     156     1
7   Mary  0    0      99     166     3

我知道有一个图书馆可以做到

from sklearn.preprocessing import OrdinalEncoder

我试过了,但没用

enc = OrdinalEncoder()
enc.fit(df[["Sex","Blood", "Study"]])

有谁能帮我找到我做错了什么,以及如何做?

8ftvxx2r

8ftvxx2r1#

你就快到了!
基本上是fit方法,准备编码器(适合您的数据,即准备Map),但不转换数据。
您必须调用transform来转换数据,或者使用fit_transform来拟合和转换相同的数据。

enc = OrdinalEncoder()
enc.fit(df[["Sex","Blood", "Study"]])
df[["Sex","Blood", "Study"]] = enc.transform(df[["Sex","Blood", "Study"]])

或直接

enc = OrdinalEncoder()
df[["Sex","Blood", "Study"]] = enc.fit_transform(df[["Sex","Blood", "Study"]])

注意:值不会是您提供的值,因为fit方法内部使用numpy.unique,它按照字母顺序而不是外观顺序对结果进行排序。
正如您在enc.categories_中所看到的

[array(['F', 'M'], dtype=object),
 array(['A', 'AB', 'B', 'O'], dtype=object),
 array(['Biology', 'English', 'Math', 'Science'], dtype=object)]```

数组中的每一个值都由它的位置编码。(F将被编码为0,M将被编码为1)

2w2cym1i

2w2cym1i2#

我认为有必要指出,这不是一个变量有序编码的例子。性别、血液和学习都不应该有有序尺度(也不是提出问题的人所建议的)。有序数据有一个排名(参见https://en.wikipedia.org/wiki/Ordinal_data)。
如果您的变量是目标变量,则可以使用LabelEncoder。(https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html
然后,您可以执行以下操作:

from sklearn.preprocessing import LabelEncoder

for col in ["Sex","Blood", "Study"]:
    df[col] = LabelEncoder().fit_transform(df[col])

如果你的变量是特性,你应该使用Ordinalencoder来完成这个任务(见我的回答的注解)。
Ordinalencoder的命名是相当不幸的,因为“ordinal”是从数学而不是统计命名的Angular 来看的。
更多关于sklearn中ordinal-和labelencoder的区别:https://datascience.stackexchange.com/questions/39317/difference-between-ordinalencoder-and-labelencoder

prdp8dxp

prdp8dxp3#

下面是一个使用sklearn apply对dataframe应用序数编码的简单示例。

import pandas as pd

df = pd.DataFrame(
    {
        "gender": ["man", "women", "child", "man", "women", "child"],
        "age": [40, 40, 10, 50, 50, 8],
    }
)

def ordinal_encoding(genders):
    le = LabelEncoder()
    le.fit(genders)
    return le.transform(genders)

encoded_genders = ordinal_encoding(df["gender"])

相关问题