1. 前言
当我们获取一份数据后,首先要对数据进行透视处理,简单来讲,我们要先去了解这个数据集有什么,在讲什么,数据的类型是什么。了解了这些之后,才能更好的去了解通过这个数据集我们想要获得什么样的结论,运用什么样的模型,更清晰明了的解决目标问题。
python中有很多内置的包可以更方便快捷的对数据进行处理。
import numpy as np
import pandas as pd
上述两个包是数据处理中最为常见的,numpy广泛适用于数学运算,pandas进行数据表格处理十分快捷。
本文以数据集Adult为例进行演示讲解。
2. 数据集及相关文件的导入
#数据信息阅读
file = open("Adult.name",'rb')
information = file.read()
print(information)
file.close()
简单的文件打开阅读操作对于数据有一个大致的了解
columns = ['Age','Workclass','fnlgwt','Education','EdNum','MaritalStatus',
'Occupation','Relationship','Race','Sex','CapitalGain',
'CapitalLoss','HoursPerWeek','Country','Income']
train_Data = pd.read_csv("/Users/ricardo/Desktop/自学/数据科学/机器学习/机器学习实战/adult/adult.data",header=None,names=columns)
#header设置为None放置数据集默认无标题将数据集第一行作为列索引
#names对每一列属性命名
读取时的参数也有许多作用:
header:指定数据集中某一行作为数据的索引,None则设置数据集不含索引
names:对数据集索引名称自定义
sep:自定义数据集的分隔符,平常工作中常常会有数据之间都在同一列的情况,设置分隔符将数据与数据之间进行分割
data = pd.read_csv('/Users/ricardo/Desktop/自学/数据科学/机器学习/机器学习实战/bank+marketing/bank/bank.csv',header=0,sep=';')
3. 数据集剖析
3.1 标签元素
train_Data['sex'].unique()
'''array(['Male','Female'],dtype=object) '''
通过unique函数,直观的看出数据集某一个标签中所含属性,为后续标准编码提供桥梁。
train_Data['sex'].value_counts() #对相应标签中属性出现次数计数
3.2 数据集统计
train_Data.describe() #对于数据集中数值数据的统计量,包含极值等
print(train_Data.shape) #获取数据集的大小
print(train_Data.dtypes) #每一个属性数据的类型
train_Data.head() #获取表格的前五行
以下是相应函数所列举出的表格数据
数值类型的数据进行统计,其中包含极值,标准差,平均值等
查看数据集的前五行,直接了解数据集的内容,一般由于数据集量大,不完全查看
pandas内置一个更简单的函数对于数据集进行剖析,一步到位得出数据集是否包含缺失值与类型:
train_Data.info()
4. 缺失值处理
在Adult数据集中并没有缺失值,缺失值在数据集中以字符的形式"?"出现,为了方便起见,将数据集中的"?"更改为缺失值
train_Data.replace(" ?",pd.NaT,inplace=True) #inplace设置为True操作将会作用于原数据集
缺失值处理一般有三种处理方式
1. 删除缺失值所在的行
最简单粗暴的方式,将原数据集中有缺失数据的样本一刀切直接删除
train_Data.dropna(inplace=True)
这种办法虽然简单快捷,但也会造成数据集的缺失
2. 填充该属性的众数,平均数,中位数等
train_Data.['Workclass'].mode()[0]
train_Data.['HoursPerWeek'].mean()
train_Data.['HourPerWeek'].median()
上述代码是获取单独某一列的众数,平均数以及中位数。注意,如果众数含有多个,会返回从小到大依次排列的数组,所以要针对性获取其中一个数据。
在pandas中填入缺失值可以以字典的形式针对性对某一列填充。
trans = {'Workclass':train_Data.['Workclass'].mode()[0],'HoursPerWeek':train_Data['HoursPerWeek'].mean()}
train_Data.fillna(trans,inplace=True)
字典中的key值对应数据集列名,对于列名进行替换其中字典中的value值。
或者直接对于某一列做处理:
trains_Data['Workclass'].fillna(trains_Data['Workclass'].mode()[0],inplace=True)
3. 自定义填充
自定义填充有许多种方式,例如重新测量或统计出缺失值的数值,针对性进行填充。
train_Data.iloc[0,0] = 3 #iloc通过矩阵的行列数获取数据
当然也可以使用预测模型(如线性回归、决策树等)来预测缺失值。这种方法较为复杂,但能够利用数据间的相关性来更准确地填充缺失值。