初识pandas包的数据预处理

浏览: 2055

前言

这篇文章是通过一个简单的数据认识pandas在数据预处理上的一个运用,这个也是写给自己以后当作参考手册用的,部分步骤缺少Python代码,后面会加上,本文可能较为简单,不适合大神;本文的数据是书名《机器学习系统设计》第一章的数据,数据处理上不参考书里

环境背景:

python环境:2.7

工具:Pycharm

1、读入数据

导入我们想要的包,自带习惯导入一些我经常用的包;

# -*- coding: UTF-8 -*-
import numpy as np 
import matplotlib as plt 
import pandas as pd 
import sys as sys 

设置一下我们的中文环境,如果不设置,部分人存放路径存在中文,这样在读入路径的无法识别 

reload(sys) 
sys.setdefaultencoding("utf-8")

先将我们的要读取的文件或者数据存到一个变量中,指定编码格式,因为路径存在中文

path=r'E:\夏尔康个人学习数据\1400OS_Code\1400OS_01_Codes\data/web_traffic.tsv'.encode('gbk')

然后通过read_csv()函数读入数据,并不是说只能读CSV格式的,可以通过SEP参数指定分隔符读取其他格式的,因为我们这个数据是不存在列名行,所以使用我们这个学习数据就是tsv格式的,分隔符是\t,然后通过head(),函数查看前几行

dataSet=pd.read_csv(path,sep='\t',header=None)
print dataSet.head()

Clipboard Image.png

数据已经成功导入,需要修改一下列名,先通过dtypes打印一下各个列名

print dataSet.dtypes

Clipboard Image.png

dataSet.rename(columns={0:'x',1:'y'},inplace=True)
print dataSet.dtypes

Clipboard Image.png

从上结果上看,我们已经修改成功了;

当然我们还可以使用read_csv函数里面的names参数,在读入的时候进行指定。

columns_name=["x","y"]
dataSet=pd.read_csv(path,sep='\t',header=None,names=columns_name)
print dataSet.dtypes

Clipboard Image.png

当然我们还可以这样进行读入数据,这个不靠pandas包里的read_csv()函数

#定义两个变量
x=[]
y=[]
path=r'E:\夏尔康个人学习数据\1400OS_Code\1400OS_01_Codes\data/web_traffic.tsv'.encode("gbk")
content=open(path,'r')
for line in content:
dataSet_x,dataSet_y=line.split("\t")
x.append(float(dataSet_x))
y.append(float(dataSet_y))
# 合成数据框
dataSet = pd.DataFrame()
dataSet["x"] = x
dataSet["y"] = y
print dataSet

Clipboard Image.png

这个结果上看和上诉的操作结果相同

2、处理缺失值

缺失值是我们数据分析中要面临的,如何处理缺失值的话有多个方法,大致说下常见的缺失值处理方法

2-1删除缺失值

这个删除又分行删除和列删除,这个删除操作慎用

2-2最大似然估计:

就是根据各个属性出现的概率组合找出概率最大的值,这个使用的前提是各个属性是相互独立的

2-3填补缺失值

K近邻填补法:过距其最近的k个邻居来估计缺失值,各个邻居对应的权重基于该邻居到具有缺失值样本的距离加权得到

中位数插补:使用非缺失值的中位数插补

变量相关性插补:找出相关性较强的属性,然后建立回归模型,得到预测结果

这里简单起见我就使用了均值插补法,不过在插补前我们先确定一下各个属性的缺失值分布,接下来我们看看这个数据框的大体分布,使用pandas包里的describe()函数,

print dataSet.describe()

Clipboard Image.png

从这个结果上看,这个数据集总共有743条记录,在Y列上存在空值,因为X和Y的count出来的结果不一致,假如数据框存在很多个列,我们想要知道空值在各个列上的情况呢?我们使用apply函数计算一下,isnull会判断是否为空生成一个布尔变量,True=1或者Flase=0,通过sum()求和就可知空值有几个

def null_count(dataset):
return sum(dataset.isnull())
print dataSet.apply(null_count,axis=0)#axis=0指定列,1为行

Clipboard Image.png

从打印结果上来看,X列不存在空值,但是Y列上存在8个值,一个个看实在是有点费力,我这里将结果写入到一个DataFrame里面去,代码逻辑简单可以在这基础上加复杂西额,不解释太多了

def ColumnNull(data):
columnList=data.columns
df=pd.DataFrame(columns=['columnName','count','null_count','nullPer'])
for column in columnList:
columnName=column
null_count=len(dataSet[dataSet[column].isnull().values==True])
count=len(dataSet)
nullPer=float(null_count)/count
df.loc[len(df)]=[columnName, count, null_count, nullPer]
print df
ColumnNull(dataSet)

Clipboard Image.png

在Y列的缺失值占到了0.01,其实可以直接删除掉即可 ,不过这里我选用这个列的均值代替缺失值

mean=dataSet.mean()['y']
dataSet["y"].fillna(mean,inplace=True)
ColumnNull(dataSet)

Clipboard Image.png

从上面的结果上看缺失值已经被替换

3、数据映射与哑变量处理

因为有时候我们需要对Y列各个值进行一个等级判断,所以我们要新增一个列LEVEL,操作顺序是设置切割点,和标签,将新生成的列加入到原有的数据框

point=[0,2000,3000,4000,5906]#切割的范围要包括全部点
point_labels=[1,2,3,4]
dataSet["flux_level"]=pd.cut(dataSet["y"],point,labels=point_labels)
接下来我们先看看在各个LEVEL下的Y均值均值和记录数,这里我们使用groupby函数
grouped_mean=dataSet["y"].groupby(dataSet["flux_level"])
grouped_count=dataSet["flux_level"].groupby(dataSet["flux_level"])
#打印结果
print "the flux_level mean is :",grouped_mean.mean()
print "the flux_level count is :",grouped_count.count()

Clipboard Image.png

3.1生成哑变量

因为有时候我们需要对离散变量进行生成哑变量,这是为了能将变量转换为模型能够使用,这里pandas的get_dummies()函能够很好的支持,生成的哑变量名使用prefix参数,意思是属性名前缀,然后将生成的哑变量数据库和原数据框通过join进行根据索引进行连接


dataSet_dum=pd.get_dummies(dataSet["flux_level"],prefix='level')
dataSet=dataSet.join(dataSet_dum)
print dataSet.head()

Clipboard Image.png

数据预处理还包括:

异常值的处理

数据集成

数据归约

数据变换等步骤

先给自己挖个坑

推荐 1
本文由 夏尔康 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

3 个评论

终于出新系列了,图片好像看不到
我现在看图片是正常呀
缓存,尔康,图片可以粘贴上去

要回复文章请先登录注册