在进行Python数据分析的时候,首先要进行数据预处理。但是有时候不得不处理一些非数值类别的数据,遇到这类问题时该怎么解决呢?
目前为止,总结了三种方法,这里分享给大家。
这种方法是属于映射字典将类标转换为整数,不过这种方法适用范围有限。
我们首先创建一个数据集:
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
继续用上面的例子来展示:
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
相当于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