Pandas中用于机器学习的列标签编码



我正在为机器学习开发汽车评估数据集,该数据集类似于

buying,maint,doors,persons,lug_boot,safety,class
vhigh,vhigh,2,2,small,low,unacc
vhigh,vhigh,2,2,small,med,unacc
vhigh,vhigh,2,2,small,high,unacc
vhigh,vhigh,2,2,med,low,unacc
vhigh,vhigh,2,2,med,med,unacc
vhigh,vhigh,2,2,med,high,unacc

我想按列将这些字符串转换为唯一的枚举整数。我知道pandas.factorize()是可行的,但它只适用于一列。如何用一个命令一次性分解数据帧。

我试过lambda函数,但它不起作用。

df.apply(λc:pd.factorize(c),轴=1)

输出:

   0     ([0, 0, 1, 1, 2, 3, 4], [vhigh, 2, small, low,...
    1     ([0, 0, 1, 1, 2, 3, 4], [vhigh, 2, small, med,...
    2     ([0, 0, 1, 1, 2, 3, 4], [vhigh, 2, small, high...
    3     ([0, 0, 1, 1, 2, 3, 4], [vhigh, 2, med, low, u...
    4       ([0, 0, 1, 1, 2, 2, 3], [vhigh, 2, med, unacc])
    5     ([0, 0, 1, 1, 2, 3, 4], [vhigh, 2, med, high, ...

我看到了编码的值,但无法从上面的数组中提取出来

Factorize返回一个元组(值,标签)。您只需要DataFrame中的值。

In [26]: cols = ['buying', 'maint', 'lug_boot', 'safety', 'class']
In [27]: df[cols].apply(lambda x: pd.factorize(x)[0])
Out[27]: 
   buying  maint  lug_boot  safety  class
0       0      0         0       0      0
1       0      0         0       1      0
2       0      0         0       2      0
3       0      0         1       0      0
4       0      0         1       1      0
5       0      0         1       2      0

然后将其连接到数字数据中。

但需要提醒的是:这意味着"低"安全和"高"安全与"中等"安全的距离相同。你最好使用pd.get_dummies:

In [37]: dummies = []
In [38]: for col in cols:
   ....:     dummies.append(pd.get_dummies(df[col]))
   ....:     
In [39]: pd.concat(dummies, axis=1)
Out[39]: 
   vhigh  vhigh  med  small  high  low  med  unacc
0      1      1    0      1     0    1    0      1
1      1      1    0      1     0    0    1      1
2      1      1    0      1     1    0    0      1
3      1      1    1      0     0    1    0      1
4      1      1    1      0     0    0    1      1
5      1      1    1      0     1    0    0      1

get_dummies有一些可选参数来控制命名,这可能是您想要的。

相关内容

  • 没有找到相关文章

最新更新