我有一个包含很多列的数据集
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"]])
有人可以帮助我发现我在做什么以及如何做吗?
谢谢
答案 0 :(得分:6)
我认为必须指出,这不是变量的序数编码的示例。性别,血液和学习都不应具有序数表(提出问题的人也未建议)。顺序数据具有排名(例如,参见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的命名是从数学而不是统计命名的角度来看“普通”的。
更多关于sklearn中的序号编码器和标签编码器的区别:https://datascience.stackexchange.com/questions/39317/difference-between-ordinalencoder-and-labelencoder
答案 1 :(得分:0)
你快到了!
基本上是fit
方法,请准备编码器(适合您的数据,即准备映射),但不要转换数据。
您必须调用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)