- 点赞、关注再看,养成良好习惯
- Life is short, U need Python
1. 概述
本文主要以小费数据集(tips.csv)为例,介绍数据预处理中常用到的不同数据类型转换方法。
- 分类型数据转换成数值型;
- 连续型数据转换成离散型。
首先,对小费数据集做一简单介绍:
- tips包含244个样本,对应数据集的每行数据。每行数据包含每个样本的七个特征(总消费金额、小费金额、顾客性别、顾客是否抽烟、聚餐的星期、聚餐的时间段、聚餐人数),所以tips数据集是一个244行7列的二维表。
- 其中,总消费金额(total_bill)和小费金额(tip)均为连续型数据集;顾客性别(sex)、是否抽烟(smoker)、聚餐的星期(day)、聚餐的时间段(time)均为分类型数据;聚餐人数(size)为离散型数据。
2. 读取数据
import pandas as pd
tips = pd.read_csv('tips.csv')
tips.head()
读取结果如上图所示(tips数据集是seaborn自带数据集,也可以在线下载读取)。
3. 分类型转数值型
3.1 map()函数
df1 = tips.copy()
dict1 = {'Male':0,'Female':1} # 设置字典参数
df1.sex = df1.sex.map(dict1)
dict2 = {'No':0,'Yes':1}
df1.smoker = df1.smoker.map(dict2)
dict3 = {'Sun':6, 'Sat':5, 'Thur':3, 'Fri':4}
df1.day = df1.day.map(dict3)
dict4 = {'Dinner':0, 'Lunch':1}
df1.time = df1.time.map(dict4)
df1.head()
3.2 repalce()函数
df2 = tips.copy()
df2.sex = df2.sex.replace(df2.sex.unique(),[0,1])
df2.smoker = df2.smoker.replace(df2.smoker.unique(),[0,1])
df2.day = df2.day.replace(df2.day.unique(),[6,5,3,4])
df2.time = df2.time.replace(df2.time.unique(),[0,1])
df2.head()
3.3 LabelEncoder(推荐)
df3 = tips.copy()
from sklearn.preprocessing import LabelEncoder
df3.sex = LabelEncoder().fit_transform(df3.sex)
df3.smoker = LabelEncoder().fit_transform(df3.smoker)
df3.day = LabelEncoder().fit_transform(df3.day)
df3.time = LabelEncoder().fit_transform(df3.time)
df3.head()
3.4 get_dummies()函数
df4 = tips.copy()
df4 = pd.get_dummies(df4.iloc[:,2:-1]) # 返回pd.DataFrame对象
df4.head()
df4 = tips.copy()
df4 = pd.get_dummies(df4,columns=['sex','smoker','day','time']) # 返回pd.DataFrame对象
df4.head()
- 注:这样可以避免数据的再次合并!
3.5 OneHotEncoder
df5 = tips.copy()
from sklearn.preprocessing import OneHotEncoder
mat = OneHotEncoder().fit_transform(df5.iloc[:,2:-1]) # 返回sparse matrix对象
arr = arr.toarray() # 返回np.array对象
arr
4. 连续型转离散型
tips.describe()
4.1 等宽法
data1 = tips.copy()
data1.total_bill = pd.cut(x=data1.total_bill,bins=4,labels=range(0,4))
data1.tip = pd.cut(x=data1.tip,bins=4,labels=range(0,4))
data1.head()
4.2 等频法
data2 = tips.copy()
data2.total_bill = pd.cut(x=data2.total_bill,bins=4,labels=range(0,4))
data2.tip = pd.cut(x=data2.tip,bins=4,labels=range(0,4))
data2.head()
4.3 二值化
二值化常用方法是Binarizer类及其类方法transform()。基本原理是设置一个阈值threshold,当记录数据大于该阈值,则标注为1,否则为0。
data3 = tips.copy()
import numpy as np
from sklearn.preprocessing import Binarizer
arr1 = np.array(data3.total_bill)
data3.total_bill = Binarizer(threshold=20).transform(arr1.reshape(-1, 1))
arr2 = np.array(data3.tip)
data3.tip = Binarizer(threshold=5).transform(arr2.reshape(-1, 1))
data3.head()
- 代码中的threshold参数值是在最小值、最大值之间博主自己取的值!
补充知识
- reshape(1,-1) 转换成1行
- reshape(2,-1) 转换成2行
- reshape(-1,1) 转换成1列
- reshape(-1,2) 转换成2列
5. 小结
-
“sex”,“smoker”,“day”,"time"四个特征为分类型数据可以通过数字编码进行数值化。
-
“tatal_bill”,"tip"两个特征为连续型数据可以通过等宽法、等频法、二值化等进行离散化。
-
用户可以结合自己的数据分别利用上述方法转换成自己所需类型的数据集!
- 写作不易,切勿白剽
- 博友们的点赞和关注就是对博主坚持写作的最大鼓励
- 持续更新,未完待续…