我有一个数据集,其中包含以下列:
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"]])
有谁能帮我找到我做错了什么,以及如何做?
3条答案
按热度按时间8ftvxx2r1#
你就快到了!
基本上是
fit
方法,准备编码器(适合您的数据,即准备Map),但不转换数据。您必须调用
transform
来转换数据,或者使用fit_transform
来拟合和转换相同的数据。或直接
注意:值不会是您提供的值,因为fit方法内部使用
numpy.unique
,它按照字母顺序而不是外观顺序对结果进行排序。正如您在
enc.categories_
中所看到的数组中的每一个值都由它的位置编码。(F将被编码为0,M将被编码为1)
2w2cym1i2#
我认为有必要指出,这不是一个变量有序编码的例子。性别、血液和学习都不应该有有序尺度(也不是提出问题的人所建议的)。有序数据有一个排名(参见https://en.wikipedia.org/wiki/Ordinal_data)。
如果您的变量是目标变量,则可以使用LabelEncoder。(https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html)
然后,您可以执行以下操作:
如果你的变量是特性,你应该使用Ordinalencoder来完成这个任务(见我的回答的注解)。
Ordinalencoder的命名是相当不幸的,因为“ordinal”是从数学而不是统计命名的Angular 来看的。
更多关于sklearn中ordinal-和labelencoder的区别:https://datascience.stackexchange.com/questions/39317/difference-between-ordinalencoder-and-labelencoder
prdp8dxp3#
下面是一个使用sklearn apply对dataframe应用序数编码的简单示例。