...多年后(因为我认为对这些问题的一个很好的解释不仅是为了这个问题,也是为了帮助提醒自己将来)
有序与名义
一般来说,我们会将分类变量转换为虚拟变量(或 host of other methodologies),因为它们是名义变量,例如他们对 a > b > c 有没有感。在 OP 的原始问题中,这将仅在伦敦、苏黎世、纽约等城市进行。
名义虚拟变量
对于此类问题,pandas 提供了 - 迄今为止 - 使用 pandas.get_dummies 的最简单的转换。所以:
# create a sample of OPs unique values
series = pandas.Series(
numpy.random.randint(low=0, high=3, size=100))
mapper = {0: 'New York', 1: 'London', 2: 'Zurich'}
nomvar = series.replace(mapper)
# now let's use pandas.get_dummies
print(
pandas.get_dummies(series.replace(mpr))
Out[57]:
London New York Zurich
0 0 0 1
1 0 1 0
2 0 1 0
3 1 0 0
分类变量的序数编码
但是对于序数变量,用户在使用pandas.factorize时必须谨慎。原因是工程师希望保留映射中的关系,使得 a > b > c。
因此,如果我想在 large > medium > small 处获取一组分类变量并保留它,我需要确保 pandas.factorize 保留该关系。
# leveraging the variables already created above
mapper = {0: 'small', 1: 'medium', 2: 'large'}
ordvar = series.replace(mapper)
print(pandas.factorize(ordvar))
Out[58]:
(array([0, 1, 1, 2, 1,... 0, 0]),
Index(['large', 'small', 'medium'], dtype='object'))
事实上,使用pandas.factorize 已经丢失了为了维护序数概念而需要保留的关系。在这种情况下,我使用自己的映射来确保保留序数属性。
preserved_mapper = {'large':2 , 'medium': 1, 'small': 0}
ordvar.replace(preserved_mapper)
print(ordvar.replace(preserved_mapper))
Out[78]:
0 2
1 0
...
99 2
dtype: int64
事实上,通过创建您自己的dict 来映射值,不仅可以保留您想要的序数关系,还可以用作“保持预测算法的内容和映射井井有条”,确保不仅您是否在此过程中没有丢失任何序数信息,而且还存储了每个变量的每个映射的记录。
ints 转为 sklearn
最后,OP 谈到将信息传递到scikit-lean 分类器,这意味着ints 是必需的。对于这种情况,如果您的数据中有任何 NaNs,请确保您知道详细信息为 here 的 astype(int) gotcha。