Python数据分析(2)——数据清洗及特征处理
- 数据清洗
- 导入数据
- 1.缺失值
- 1.1缺失值的查询
- 1.2 缺失值的处理
- 1.2.1利用dropna处理
- 1.2.2 利用fillna处理
- 2 重复值
- 2.1查看重复值
- 2.2 处理重复值
- 特征处理
- 1.离散化处理
- 2.将文本数据转换
- 2.1利用value_counts函数查看数据类别
- 2.2 利用map函数转换数据类型
- 2.3将类别文本转换为one-hot编码
- 友情链接
本文延续使用
kaggle泰坦尼克号数据。
数据清洗
对于我们拿到的原数据来说,它们常常含有一些异常值、缺失值、重复值,数据类型也是多种多样,不能用于直接分析,需要经过一定的预处理才能继续进行建模或分析。
导入数据
#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
data = pd.read_csv('train.csv')
data.head(3)
1.缺失值
1.1缺失值的查询
#(1)通过info或describe查询
data.info()
#data.describe()
#(2)通过isnull函数实现操作
data.isnull()#返回一个bool类型判断矩阵,缺失为True,存在为False
data.isnull().sum()#常用isnull.sum()直接返回缺失值个数
data.isnull().any()#若有缺失值(空)的列,则该列返回True,否则为False
#清楚显示缺失值的行列
data[data.isnull().values==True]#可以指定特定的行列
1.2 缺失值的处理
缺失值的处理,我们常用pandas的**fillna()与dropna()**函数
#检索特定列缺失值
#data[data['Age']==None]=0
#data[data['Age'].isnull()] = 0
data[data['Age'] == np.nan] = 0
data.head()
#这里有三种方法检索缺失值,但用最后一种较好,在numpy中nan或NAN的类型属于一种规定的特殊浮点数之一
#在读取数值列时,空缺值的数据类型为float64,用None一般索引不到,所以nan较好
1.2.1利用dropna处理
- axis : 0为行 1为列,default 0,数据删除维度
- how :{‘any’, ‘all’}, any:删除带有nan的行;all:删除全为nan的行
- thresh : int,保留至少 int 个非nan行
- subset:list,在特定列缺失值处理
- inplace : bool,是否修改源文件
#调用函数
data.dropna()
data.head()
1.2.2 利用fillna处理
- value : 固定值填充
- method :‘ffill’ 用前一个非空缺值填充;‘bfill’ 用后一个非空缺值填充
- axis:‘index’:按行填充;'columns’按列填充
- inplace : 是否用新生成的列表替换原列表
#例如:用零填充所有缺失值
data.fillna(0).head(3)
#可以用数据均值(最大值、最小值、三次样条插值)
data['Age'].fillna(value = data['Age'].mean())#此处为举例,实际年龄缺失值的填充并非如此
2 重复值
2.1查看重复值
#此处较为简单,同前一种相似,调用duplicated函数
data[data.duplicated()]
2.2 处理重复值
这里用到drop_duplicates函数
- subset: 列标签,可选
- keep: {‘first’, ‘last’, False}, 默认值 ‘first’
first:保留第一次出现的重复项
last: 删除重复项,仅保留最后一次出现的重复项
False: 删除所有重复项- inplace:布尔值,默认为False,是否删除重复项或返回副本
#subset设置为None的时候,默认所有列,意思是所有列同时(即:完全一样的两行)为重复的时候才删除。
data = df.drop_duplicates()
data.head()
#保存数据
data.to_csv('test_clear.csv')
特征处理
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征。
1.离散化处理
数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
对于某些数据,如年龄、消费金额等,常常采取离散化的处理方式,及将数据分段,常用cut函数。
- series :类似数组排列,必须是一维的
- bins:表示分段数或分类区间,可以是数字,比如说4,就是分成4段,也可以是列表,表示各段的间隔点)
- right=True:表示分组右边闭合,right=False表示分组左边闭合
- labels :表示结果标签,一般最好添加,方便阅读和后续统计
#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
data['AgeBand'] = pd.cut(data['Age'], 5,labels = [1,2,3,4,5])
#或指定区间(0,5] (5,15] (15,30] (30,50] (50,80]
#data['AgeBand'] = pd.cut(data['Age'], [0,5,15,30,50,80],labels = [1,2,3,4,5])
#或指定百分比10% 30% 50 70% 90%
#data['AgeBand'] = pd.cut(data['Age'], [0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
data.head()
2.将文本数据转换
处理文本数据的方式有多种
2.1利用value_counts函数查看数据类别
value_counts(values,sort=True, ascending=False, normalize=False,bins=None,dropna=True)
- sort=True: 是否要进行排序;默认进行排序
- ascending=False: 默认降序排列
- normalize=False: 是否要对计算结果进行标准化并显示标准化后的结果,默认是False
- bins=None:可以自定义分组区间,默认是否 dropna=True:是否删除缺失值nan,默认删除
data['Sex'].value_counts()
#data['Cabin'].value_counts()
#data['Embarked'].value_counts()
2.2 利用map函数转换数据类型
map(insert function here, insert iterable here)
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。
#我们常常利用for来遍历元素并将其填入列表中,但这种方法远不及map有效并且减少内存
data['Sex_num'] = data['Sex'].map({'male': 1, 'female': 2})
data.head()
2.3将类别文本转换为one-hot编码
这里利用pandas.get_dummies函数(返回结果的独热编码矩阵)
p = pd.get_dummies(data['Embarked'] , prefix = 'Embarked')#指定特定的列进行转换,prefix加上一段前缀
data = pd.concat([data,p],axis = 1)#将结果与数据拼接起来
data.head()
本文就先到这里叭