2 第二章:数据清洗及特征处理
我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的亚子。
2.1 缺失值观察与处理
我们拿到的数据经常会有很多缺失值,比如我们可以看到Cabin列存在NaN,那其他列还有没有缺失值,这些缺失值要怎么处理呢
2.1.1 任务一:缺失值观察
(1) 请查看每个特征缺失值个数
查看数据信息
df.info()
查看缺失值个数
df.isnull().sum()
(2) 请查看Age, Cabin, Embarked列的数据
df.loc[:,['Age', 'Cabin', 'Embarked']].head()
2.1.2 任务二:对缺失值进行处理
(1)处理缺失值一般有几种思路
(2) 请尝试对Age列的数据的缺失值进行处理
(3) 请尝试使用不同的方法直接对整张表的缺失值进行处理
#使用年龄均值填补缺失值
df.loc[:,"Age"].fillna(df.loc[:,"Age"].mean(), inplace = True)
df.loc[:,"Age"].isnull().sum()
#删除Cabin列
df.drop("Cabin", axis=1, inplace=True)
#删除Embarked缺失行
df.dropna(inplace=True)
df.isnull().sum()
2.2 重复值观察与处理
2.2.1 任务一:请查看数据中的重复值
for i in range(df.columns.shape[0]):
print(df.columns[i], 'duplicate', df.duplicated(subset=df.columns[i]).sum())
2.2.2 任务二:对重复值进行处理
df.drop_duplicates(inplace=True)
2.2.3 任务三:将前面清洗的数据保存为csv格式
df.to_csv("test_clear.csv")
2.3 特征观察与处理
我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
2.3.1 任务一:对年龄进行分箱(离散化)处理
(1) 分箱操作是什么?
可以将连续数值转换成为离散区间。
(2) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df.loc[:, 'AgeBand'] = pd.cut(df.loc[:, 'Age'], bins=5, labels=[1,2,3,4,5])
df.head()
(3) 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
bins = [0, 5, 15, 30, 50, 80]
df.loc[:, 'AgeBand'] = pd.cut(df.loc[:, 'Age'], bins = bins, right=False, labels=[1,2,3,4,5])
df.head()
(4) 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
q = [0, 0.1, 0.3, 0.5, 0.7, 0.9]
df.loc[:, 'AgeBand'] = pd.qcut(df.loc[:, 'Age'], q = q, labels=[1,2,3,4,5])
df.head()
(5) 将上面的获得的数据分别进行保存,保存为csv格式
2.3.2 任务二:对文本变量进行转换
(1) 查看文本变量名及种类
#方法一: value_counts
df.loc[:, 'Sex'].value_counts()
#方法二: unique
df.loc[:, 'Sex'].unique()
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
#方法一: replace
df.loc[:, 'Sex_num'] = df.loc[:, 'Sex'].replace(['male', 'female'], [0, 1])
#方法二: map
df.loc[:, 'Sex_num'] = df.loc[:, 'Sex'].map({'male':0, 'female':1})
#方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
lbl = LabelEncoder()
lbl.fit_transform(df.loc[:, 'Sex'])
df.head()
(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示
#方法一: 使用sklearn.preprocessing的OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
ohenc = OneHotEncoder()
df.loc[:, ['male','female']] = ohenc.fit_transform(np.array(df.loc[:, 'Sex_num']).reshape(-1,1)).toarray()
df.head()
#方法二: 使用get_dummies
pd.get_dummies(df.loc[:, 'Sex'])
2.3.3 任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
df.Name.str.extract('([a-zA-z]+\.)')
df.Name.str.extract('([a-zA-z]+\.)').value_counts()