2016-08-03 63 views
3

我对一个熊猫df中的一列中的scikit-learn LabelEncoder适合。LabelEncoder适合熊猫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

我也在使用LabelEncoder,将字符串编码为整数标签,并提出一个问题,其中用户希望数字标签出现的顺序与特定顺序相同,就像您所描述的那样。找出如何做到这一点?我可能只需要写我自己的。 –

+1

按照您所说的定制解决方案,或修复scikit-learn版本并依据排序顺序,如Mephy的答案中所述。这就是它对我来说的样子。 – tkja

+1

是的谢谢我只是把它作为一个字典查找,反正很快。谢谢 –

回答

1

它按排序顺序完成。在字符串的情况下,它按字母顺序完成。有这个没有文档,但查看源代码LabelEncoder.transform我们可以看到工作主要是委托给函数numpy.setdiff1d,具有下列文件:

查找两个数组的差集。

返回排序的,ar1中不在ar2中的唯一值。

(Emphasis mine)。

请注意,由于这没有记录,它可能是实现定义的,可以在版本之间进行更改。可能是因为我查看的版本使用排序顺序,其他版本的scikit-learn可能会改变这种行为(不使用numpy.setdiff1d)。

+0

至少在目前的版本中,它很清楚它是如何完成的,它的行为是确定性的。 – tkja

+0

@tkja但我宁愿不要依赖于此。如果它对你的应用程序很重要,那么不妨自己实现编码。如果您依赖它并且它发生了变化,那么追踪bug将非常困难。 – Mephy