数据分析入门(二)数据清洗
我们得到的数据通常并不是一开始就是我们想要的,这时候我们需要对数据进行清洗,以期望最后以我们所要的方式呈现出来,并且便于后面的分析与建模。
上一篇:数据分析入门一
缺失值观察与处理
我们得到的数据中往往可能会有一些缺失值,这个缺失值如果不进行处理的话,会对我们后面的分析造成很大影响。
缺失值观察
一般我们可以用两种方法对缺失值进行观察,如下:
缺失值处理
对于缺失值我们可以将它舍去,有dropna()方法。我们也可以用其他的值进行填充,有fillna()方法。
关于这两个方法如何运用,我们在jupyter中将光标移动到方法处,按Shift+Tab键即可显示。
还可以去参考官网:https://pandas.pydata.org/docs/index.html
重复值观察与处理
在一些情况下我们还可能会有重复值需要处理,比如客户联系方式中中出现了两个同样的人,又或者是客户新换了电话,等等,这时候我们需要对重复值进行处理,只保留一个。
重复值观察
pandas有duplicated()方法
这个方法有以下参数参数:
subset=None:列标签或标签序列,可选# 只考虑某些列来识别重复项;默认使用所有列
keep=‘first’:{‘first’,‘last’,False}
- first:将第一次出现重复值标记为True
- last:将最后一次出现重复值标记为True
- False:将所有重复项标记为
True inplace 返回:副本或替代
这里泰坦尼克号的数据试了一下后发现并没有重复数据,显然是因为kaggle已经对数据进行了处理了。
重复值处理
在我们第一步进行数据观察标记后,直接用df.drop_duplicates()方法可以将标记为true的数据给去除掉。
特征观察与处理
首先我们对特征进行一下观察,可以把特征大概分为两大类:
- 数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
- 文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
下面分别对这两种类型的数据进行处理。
数值类型的分箱操作
分箱操作:在建模前,需要对连续变量离散化,特征离散化后,模型会更稳定,降低了模型过拟合的风险。
分享操作有等距分箱和等频分箱。
在pandas中对数据进行分箱操作可以采用cut方法。
下面是bins参数的三种形式
#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'], 5,labels = ['1','2','3','4','5'])
#将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = ['1','2','3','4','5'])
#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = ['1','2','3','4','5'])
文本类型数据的处理
为了后面的建模分析,我们需要将文本类型数据转变为数值类型数据。
我们先处理一下类型文本类数据。
- 查看他们有多少种类型。可以用两种方法 value_counts() 和unique()
- 将类型替换为数值,这里方法较多。
#使用replace,用一个列表替换掉另一个列表
df[‘Sex_num’] = df[‘Sex’].replace([‘male’,‘female’],[1,2])
#使用一个字典,用value替换key
df[‘Sex_num’] = df[‘Sex’].map({‘male’: 1, ‘female’: 2})
显然如果直接使用上述两种方法,对于一些类型很多就不太方便,这时候我们采取如下两种手段
# 法三,配合其他方法加上map方法实现
for feat in ['Cabin', 'Ticket']:
lbl = LabelEncoder()
label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
df[feat + "_labelEncode"] = df[feat].map(label_dict)
注:
unique()是以 数组形式(numpy.ndarray)返回列的所有唯一值(特征的所有唯一值)
nunique() Return number of unique elements in the object.即返回的是唯一值的个数
#法四 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder for feat in ['Cabin', 'Ticket']:
lbl = LabelEncoder()
df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
拓展
- 将类别文本转换为one-hot编码(one-hot编码在机器学习中用的挺多。)
这里用到的是pandas自带的get_dummies()方法
x = pd.get_dummies(df['Age'], prefix='Age')
df = pd.concat([df, x], axis=1)
- 从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
这里匹配用的正则表达式,而str.extract(),可用正则从字符数据中抽取匹配的数据,只返回第一个匹配的数据。
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
上一篇: 数据分析之数据清洗(四)
下一篇: 动手学数据分析之“数据清洗及特征处理”