我在大熊猫LabelEncoder的专栏中使用scikit-learn df。
如何确定遇到的字符串映射到整数的顺序?这是确定性的吗?
更重要的是,我可以指定此订单吗?
import pandas as pd
from sklearn import preprocessing
df = pd.DataFrame(data=["first", "second", "third", "fourth"], columns=['x'])
le = preprocessing.LabelEncoder()
le.fit(df['x'])
print list(le.classes_)
### this prints ['first', 'fourth', 'second', 'third']
encoded = le.transform(["first", "second", "third", "fourth"])
print encoded
### this prints [0 2 3 1]
我希望le.classes_
为["first", "second", "third", "fourth"]
,然后encoded
为[0 1 2 3
],因为这是字符串在列中的显示顺序。可以这样做吗?
答案 0 :(得分:2)
按排序顺序完成。在字符串的情况下,它按字母顺序完成。没有相关的文档,但查看LabelEncoder.transform的源代码,我们可以看到工作主要委托给函数numpy.setdiff1d,并附带以下文档:
找出两个数组的集合差异。
返回ar1中不在ar2中的已排序唯一值。
(强调我的)。
请注意,由于没有记录,因此可能是实现定义的,可以在版本之间进行更改。可能只是我看到的版本使用了排序顺序,其他版本的scikit-learn可能会改变这种行为(不使用numpy.setdiff1d)。
答案 1 :(得分:2)
我也对不能向LabelEncoder
下达命令感到有些惊讶。一线解决方案可以是这样的:
df['col1_num'] = df['col1'].apply(lambda x: ['first', 'second', 'third', 'fourth'].index(x))
答案 2 :(得分:0)
我想为我的一个应用程序指定LabelEncoder的顺序。由于我不想迁移一些代码并使用其他一些库。我设法实现了暂时的解决方法。
从一开始我就知道数据集中的类别,所以我创建了虚拟类别,这些虚拟类别将按字母顺序排列为所需的特定顺序。例子
{
0:ARejected,
1:ZApproved
}
之后,我将标签编码器安装到数据集上。装好后,我将替换标签编码器的类,以确保将来可以按需要映射标签。
le=LabelEncoder()
le.fit (X)
le.classes = np.array(['Rejected,'Approved'])
这可能在某些情况下对某些人有帮助。绝对不是永久性的解决方案,因为再次安装编码器时,信息可能会松散。或者,如果类别数量太大。
答案 3 :(得分:0)
我建议您使用 OrdinalEncoder
包中的 category_encoders
。它有一个 mapping 参数,您可以在其中为每个类别设置所需的转换。您可以在 https://medium.datadriveninvestor.com/axios-instance-interceptors-682868f0de2d 中阅读更多相关信息。
这是一个实现示例:
from category_encoders import OrdinalEncoder
# Ascending order according to value counts
keys = df.columnName.value_counts().sort_values(ascending=False).index
values = list(range(len(keys))) # do np.array()+1 in case you want it to start with 1
mapping = [{
'col': 'columnName',
'mapping': dict(zip(keys, values))
}]
oe = OrdinalEncoder(cols=['columnName'], mapping=mapping)
df.columnName = oe.fit_transform(df).columnName # Read note
注意:我建议以这种方式应用编码,因为编码器可能会导致更改其他列的 dtype 出现问题。