【Python】数据预处理之将类别数据转换为数值的方法(含Python代码分析)

在进行Python数据分析的时候,首先要进行数据预处理。但是有时候不得不处理一些非数值类别的数据,遇到这类问题时该怎么解决呢?

目前为止,总结了三种方法,这里分享给大家。

一、通过mapping方式,将类别映射为数值

这种方法是属于映射字典将类标转换为整数,不过这种方法适用范围有限。

我们首先创建一个数据集:

import pandas as pd
df = pd.DataFrame([['green', 'M', 10.1, 'class1'],
          ['red', 'L', 13.5, 'class2'],
          ['blue', 'XL', 15.3, 'class1']])
df.columns =['color', 'size', 'price', 'classlabel']

我们展示一下数据集:

   color size  price classlabel
0  green    M   10.1     class1
1    red    L   13.5     class2
2   blue   XL   15.3     class1

我们想把size列的类别转换成数值,可以这样操作:

size_mapping = {'XL':3, 'L':2, 'M':1}
df['size'] = df['size'].map(size_mapping)

我们看一下结果:

   color  size  price classlabel
0  green     1   10.1     class1
1    red     2   13.5     class2
2   blue     3   15.3     class1

我们继续将classlabel列转换成数值型,代码如下:

class_mapping = {label: idx for idx, label in enumerate(np.unique(df['classlabel']))}
df['classlabel'] = df['classlabel'].map(class_mapping)
print('2,',df)

结果展示如下:

2,    color  size  price  classlabel
0  green     1   10.1           0
1    red     2   13.5           1
2   blue     3   15.3           0

二、通过LabelEncoder来进行快速的转换

继续用上面的例子来展示:

   color size  price classlabel
0  green    M   10.1     class1
1    red    L   13.5     class2
2   blue   XL   15.3     class1

我们对classlabel进行转换:

class_encoder = LabelEncoder()
df['classlabel'] = class_encoder.fit_transform(df['classlabel'].values)
print(df)

结果展示如下:

   color size  price  classlabel
0  green    M   10.1           0
1    red    L   13.5           1
2   blue   XL   15.3           0

可以看到,classlabel列自动实现了编码,class1对应的类别为1,class2对应的类别为2。

这种转换比较快速方便,但是编码的可识别性也较低,比如我们在同样的基础上继续对size和color进行转换。

class_encoder = LabelEncoder()
color_encoder=LabelEncoder()
size_encoder=LabelEncoder()
df['classlabel'] = class_encoder.fit_transform(df['classlabel'].values)
df['size']=size_encoder.fit_transform(df['size'].values)
df['color']=color_encoder.fit_transform(df['color'].values)
print(df)

结果展示为:

   color  size  price  classlabel
0      1     1   10.1           0
1      2     0   13.5           1
2      0     2   15.3           0

可以看到,转换的类型几乎是一致的,当变量较多时,会出现表意不明的错误。

三、通过pd.get_dummies方法来转换

pd.get_dummies相当于onehot编码,常用与把离散的类别信息转化为onehot编码形式。

官方文档:

def get_dummies(data, 
                prefix=None, 
                prefix_sep='_', 
                dummy_na=False,
                columns=None,
                sparse=False,
                drop_first=False,
                dtype=None)

对于上面的例子,我们转换为:

df2=pd.get_dummies(df)
print(df2)

结果展示为:

   price  color_blue  color_green  color_red  size_L  size_M  size_XL  classlabel_class1  classlabel_class2       
0   10.1           0            1          0       0       1        0                  1                  0       
1   13.5           0            0          1       1       0        0                  0                  1       
2   15.3           1            0          0       0       0        1                  1                  0       

如果我们转换其中一列呢?

color_encoder=pd.get_dummies(df[['color']])
df2=pd.concat([color_encoder,df],axis=1)
print(df2)

结果展示为:

   color_blue  color_green  color_red  color size  price classlabel
0           0            1          0  green    M   10.1     class1
1           0            0          1    red    L   13.5     class2
2           1            0          0   blue   XL   15.3     class1

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年5月28日
下一篇 2023年5月28日

相关推荐