数据采集与预处理(共9章)-第8章-使用pandas进行数据清洗.ppt
- 文档编号:30787286
- 上传时间:2023-09-22
- 格式:PPT
- 页数:153
- 大小:667.04KB
数据采集与预处理(共9章)-第8章-使用pandas进行数据清洗.ppt
《数据采集与预处理(共9章)-第8章-使用pandas进行数据清洗.ppt》由会员分享,可在线阅读,更多相关《数据采集与预处理(共9章)-第8章-使用pandas进行数据清洗.ppt(153页珍藏版)》请在冰豆网上搜索。
,第8章使用pandas进行数据清洗,数据采集与预处理,8.1NumPy的基本使用方法,NumPy是Python语言的一个扩充程序库,支持高级的数组与矩阵运算,此外也针对数组运算提供了大量的数学函数库,包括线性代数运算、傅立叶变换和随机数生成等。
如果没有安装NumPy,可以在Windows系统的cmd窗口中执行如下命令安装:
pipinstallnumpy,8.1.1数组创建8.1.2数组索引和切片8.1.3数组运算,8.1.1数组创建,下面是数组创建的一些具体实例:
importnumpyasnpa=1,2,3,4,5#创建简单的列表b=np.array(a)#将列表转换为数组barray(1,2,3,4,5)b.size#数组的元素个数5b.shape#数组的形状(5,)b.ndim#数组的维度1,8.1.1数组创建,b.dtype#数据的元素类型dtype(int32)print(b0,b1,b2)#访问数组元素123b4=6#修改数组元素barray(1,2,3,4,6)c=np.array(1,2,3,4,5,6)#创建二维数组c.shape#数组的形状(2,3)print(c0,0,c0,1,c0,2,c1,0,c1,1,c1,2)123456,8.1.1数组创建,Python做数据处理的时候经常要初始化高维矩阵,常用的函数包括zeros()、ones()、empty()、eye()、full()、random.random()、random.randint()、random.rand()、random.randn()等,具体如下:
(1)zeros():
创建一个矩阵,内部元素均为0,第一个参数提供维度,第二个参数提供类型。
a=np.zeros(2,3,int)aarray(0,0,0,0,0,0),8.1.1数组创建,
(2)ones():
创建一个矩阵,内部元素均为1,第一个参数提供维度,第二个参数提供类型。
a=np.ones(2,3,int)aarray(1,1,1,1,1,1)(3)empty():
创建一个矩阵,内部是无意义的数值,第一个参数提供维度,第二个参数提供类型。
a=np.empty(2,3,int)aarray(0,0,0,0,0,0),8.1.1数组创建,(4)eye():
创建一个对角矩阵,第一个参数提供矩阵规模,对于第二个参数而言,如果为0则对角线全为“1”,大于0则右上方第K条对角线全为“1”,小于0则左下方第K条对角线全为“1”,第三个参数提供类型。
a=np.eye(3,k=1,dtype=int)aarray(0,1,0,0,0,1,0,0,0)a=np.eye(4,k=-2,dtype=int)aarray(0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0),8.1.1数组创建,(5)full():
full(m,n),c)可以生成一个mn的元素全为c的矩阵。
a=np.full(2,3),4)aarray(4,4,4,4,4,4)(6)random.random():
random.random(m,n)生成一个mn的元素为01之间随机数的矩阵。
a=np.random.random(2,3)aarray(0.46657535,0.2398773,0.18675721,0.30525201,0.66826887,0.5708038),8.1.1数组创建,(7)random.randint():
numpy.random.randint(low,high=None,size=None,dtype=l)函数的作用是,返回一个随机整型数,范围从低(包括)到高(不包括),即low,high)。
如果没有写参数high的值,则返回0,low)的值。
a=np.random.randint(2,size=10)aarray(0,1,0,0,1,1,0,0,1,1)b=np.random.randint(5,size=(2,4)barray(1,2,3,3,0,0,2,4),8.1.1数组创建,(8)random.rand():
random.rand(d0,d1,dn)函数根据给定维度生成0,1)之间的数据,其中,dn表示每个维度的元素个数。
a=np.random.rand(4,2)aarray(0.22225254,0.25555882,0.69250455,0.62957494,0.567664,0.30459249,0.16394031,0.00900947)(9)random.randn():
random.randn(d0,d1,dn)函数返回一个或一组样本,具有标准正态分布,其中,dn表示每个维度的元素个数。
a=np.random.randn(2,4)aarray(-0.28183753,-0.4931384,-2.11355842,0.17782074,-1.14089585,0.816798,0.39287532,-0.19339946),8.1.2数组索引和切片,与Python列表类似,可以对NumPy数组进行索引和切片。
由于数组可能是多维的,因此,必须为数组的每个维度指定一个索引或切片。
具体实例如下:
a=np.arange(10)aarray(0,1,2,3,4,5,6,7,8,9)a55a5:
8array(5,6,7)a5:
8=12aarray(0,1,2,3,4,12,12,12,8,9)a=np.arange(10)a_slice=a5:
8,8.1.2数组索引和切片,a_slice0=-1a_slicearray(-1,6,7)aarray(0,1,2,3,4,-1,6,7,8,9)b=np.array(1,2,3,4,5,6,7,8,9)b2array(7,8,9)b023b0,23b:
2array(1,2,3,4,5,6),8.1.2数组索引和切片,b:
2,1:
array(2,3,5,6)b1,:
2array(4,5)b:
2,2array(3,6)b:
:
1array(1,4,7),8.1.3数组运算,数组运算实质上是数组对应位置的元素进行运算,常见的是加、减、乘、除、开方等运算。
具体实例如下:
a=np.array(1,2,3,4,5,6)a*aarray(1,4,9,16,25,36)a-aarray(0,0,0,0,0,0)1/aarray(1.,0.5,0.33333333,0.25,0.2,0.16666667)a+aarray(2,4,6,8,10,12),8.1.3数组运算,np.exp(a)#e的幂次方array(2.71828183,7.3890561,20.08553692,54.59815003,148.4131591,403.42879349)np.sqrt(a)array(1.,1.41421356,1.73205081,2.,2.23606798,2.44948974)a*2array(1,4,9,16,25,36,dtype=int32),8.2pandas数据结构,本节介绍pandas数据结构,包括Series、DataFrame和索引对象。
在开展具体实验之前,首先要打开一个cmd窗口执行如下命令安装pandas:
pipinstallpandas,8.2.1Series8.2.2DataFrame8.2.3索引对象,8.2.1Series,Series是一种类似于一维数组的对象,它由一维数组以及一组与之相关的数据标签(即索引)组成,仅由一组数据即可产生最简单的Series。
Series的字符串表现形式为:
索引在左边,值在右边。
如果没有为数据指定索引,就会自动创建一个0到N-1(N为数据的长度)的整数型索引。
可以通过Series的values和index属性获取其数组表现形式和索引对象。
下面是具体实例:
importnumpyasnpimportpandasaspdfrompandasimportSeries,DataFrameobj=Series(3,5,6,8,9,2)obj031526384952dtype:
int64obj.indexRangeIndex(start=0,stop=6,step=1),8.2.1Series,上面的代码中,我们没有为数据指定索引,因此,pandas会自动创建一个整型索引。
现在,我们创建对数据点进行标记的索引,作为演示,下面继续执行如下代码:
obj2=Series(3,5,6,8,9,2,index=a,b,c,d,e,f)obj2a3b5c6d8e9f2dtype:
int64obj2.indexIndex(a,b,c,d,e,f,dtype=object),8.2.1Series,创建好Series以后,可以利用索引的方式选取Series的单个或一组值。
作为演示,下面继续执行如下代码:
obj2a3obj2b,d,fb5d8f2dtype:
int64,8.2.1Series,可以对Series进行NumPy数组运算。
作为演示,下面继续执行如下代码:
obj2obj25c6d8e9dtype:
int64obj2*2#乘以2a6b10c12d16e18f4dtype:
int64,8.2.1Series,np.exp(obj2)#求e的幂次方a20.085537b148.413159c403.428793d2980.957987e8103.083928f7.389056dtype:
float64,8.2.1Series,可以将Series看成是一个有定长的有序字典,因为它是索引值到数据值的一个映射。
因此,一些字典函数也可以在这里使用。
作为演示,下面继续执行如下代码:
binobj2Trueminobj2False此外,也可以用字典创建Series。
作为演示,下面继续执行如下代码:
dic=m:
4,n:
5,p:
6obj3=Series(dic)obj3m4n5p6dtype:
int64,8.2.1Series,使用字典生成Series时,可以指定额外的索引。
如果额外的索引与字典中的键不匹配,则不匹配的索引部分数据为NaN。
作为演示,下面继续执行如下代码:
ind=m,n,p,aobj4=Series(dic,index=ind)obj4m4.0n5.0p6.0aNaNdtype:
float64,8.2.1Series,pandas提供了isnull()和notnull()函数用于检测缺失数据。
作为演示,下面继续执行如下代码:
pd.isnull(obj4)mFalsenFalsepFalseaTruedtype:
boolpd.notnull(obj4)mTruenTruepTrueaFalsedtype:
bool,8.2.1Series,可以对不同的Series进行算术运算,在运算过程中,pandas会自动对齐不同索引的数据。
作为演示,下面继续执行如下代码:
obj3+obj4aNaNm8.0n10.0p12.0dtype:
float64Series对象本身及其索引都有一个name属性。
作为演示,下面继续执行如下代码:
obj4.name=sereis_aobj4.index.name=letterobj4letterm4.0n5.0p6.0aNaNName:
sereis_a,dtype:
float64,8.2.1Series,Series的索引可以通过赋值的方式进行改变。
作为演示,下面继续执行如下代码:
obj4.index=u,v,w,aobj4u4.0v5.0w6.0aNaNName:
sereis_a,dtype:
float64,8.2.2DataFrame,DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。
DataFrame既有行索引也有列索引,它可以被看作由Series组成的字典(公用同一个索引)。
跟其他类似的数据结构相比,DataFrame中面向行和面向列的操作基本是平衡的。
其实,DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或者别的一维数据结构)。
8.2.2DataFrame,下面是具体实例:
importnumpyasnpimportpandasaspdfrompandasimportSeries,DataFramedata=sno:
95001,95002,95003,95004,name:
Xiaoming,Zhangsan,Lisi,Wangwu,sex:
M,F,F,M,age:
22,25,24,23frame=DataFrame(data)framesnonamesexage095001XiaomingM22195002ZhangsanF25295003LisiF24395004WangwuM23,8.2.2DataFrame,从执行结果可以看出,虽然没有指定行索引,但是,pandas会自动添加索引。
如果指定列索引,则会按照指定顺序排列。
作为演示,继续执行如下代码:
frame=DataFrame(data,columns=name,sno,sex,age)framenamesnosexage0Xiaoming95001M221Zhangsan95002F252Lisi95003F243Wangwu95004M23,8.2.2DataFrame,在制定列索引时,如果存在不匹配的列,则不匹配的列的值为NaN:
frame=DataFrame(data,columns=sno,name,sex,age,grade)framesnonamesexagegrade095001XiaomingM22NaN195002ZhangsanF25NaN295003LisiF24NaN395004WangwuM23NaN,8.2.2DataFrame,可以同时指定行索引和列索引:
frame=DataFrame(data,columns=sno,name,sex,age,grade,index=a,b,c,d)framesnonamesexagegradea95001XiaomingM22NaNb95002ZhangsanF25NaNc95003LisiF24NaNd95004WangwuM23NaN,8.2.2DataFrame,通过类似字典标记或属性的方式,可以获取Series(列数据):
framesnoa95001b95002c95003d95004Name:
sno,dtype:
objectframe.nameaXiaomingbZhangsancLisidWangwuName:
name,dtype:
object,8.2.2DataFrame,行也可以通过位置或名称获取:
frame.locbsno95002nameZhangsansexFage25gradeNaNName:
b,dtype:
objectframe.iloc1sno95002nameZhangsansexFage25gradeNaNName:
b,dtype:
object,8.2.2DataFrame,或者,也可以采用“切片”的方式一次获取多个行:
frame.locb:
csnonamesexagegradeb95002ZhangsanF25NaNc95003LisiF24NaNframe.iloc2:
4snonamesexagegradec95003LisiF24NaNd95004WangwuM23NaN,8.2.2DataFrame,可以用“切片”的方式使用列名称获取1个列:
frame.loc:
sexsexaMbFcFdM也可以用“切片”的方式使用列名称获取多个列:
frame.loc:
sex:
sexagegradeaM22NaNbF25NaNcF24NaNdM23NaN上面的代码在截取列时,是从sex列开始截取,并把sex之后的所有列都截取出来。
8.2.2DataFrame,还可以用“切片”的方式使用列索引获取多个列:
frame.iloc:
1:
4namesexageaXiaomingM22bZhangsanF25cLisiF24dWangwuM23上面的代码在截取列时,从索引号为1的列开始截取,也就是从name列开始截取,一直截取到索引号为4的列之前(不含索引号为4的列)。
8.2.2DataFrame,可以给列赋值,赋值是列表的时候,列表中元素的个数必须和数据的行数匹配:
framegrade=93,89,72,84framesnonamesexagegradea95001XiaomingM2293b95002ZhangsanF2589c95003LisiF2472d95004WangwuM2384,8.2.2DataFrame,可以用一个Series修改一个DataFrame的值,将精确匹配DataFrame的索引,空位将补上缺失值:
framegrade=Series(67,89,index=a,c)framesnonamesexagegradea95001XiaomingM2267.0b95002ZhangsanF25NaNc95003LisiF2489.0d95004WangwuM23NaN,8.2.2DataFrame,可以增加一个新的列:
frameprovince=ZheJiang,FuJian,Beijing,ShangHaiframesnonamesexagegradeprovincea95001XiaomingM2267.0ZheJiangb95002ZhangsanF25NaNFuJianc95003LisiF2489.0Beijingd95004WangwuM23NaNShangHai当不再需要一个列时,可以删除该列:
delframeprovinceframesnonamesexagegradea95001XiaomingM2267.0b95002ZhangsanF25NaNc95003LisiF2489.0d95004WangwuM23NaN,8.2.2DataFrame,可以把嵌套字典(字典的字典)作为参数,传入DataFrame,其中,外层字典的键作为列(column),内层键作为行索引(index):
dic=computer:
2020:
78,2021:
82,math:
2019:
76,2020:
78,2021:
81frame1=DataFrame(dic)frame1computermath202078.078202182.0812019NaN76可以对结果进行转置:
frame1.T202020212019computer78.082.0NaNmath78.081.076.0,8.2.2DataFrame,还可以指定行索引,对于不匹配的行会返回NaN:
frame2=DataFrame(dic,index=2020,2021,2022)frame2computermath202078.078.0202182.081.02022NaNNaN,8.2.2DataFrame,下面用NumPy的相关模块来生成DataFrame:
importnumpyasnpimportpandasaspd#用顺序数np.arange(12).reshape(3,4)df1=pd.DataFrame(np.arange(12).reshape(3,4),columns=a,b,c,d)df1abcd00123145672891011#用随机数np.random.randint(20,size=(2,3)df2=pd.DataFrame(np.random.randint(20,size=(2,3),columns=b,d,a)df2bda0019411025,8.2.2DataFrame,#用随机数np.random.randn(5,3)df3=pd.DataFrame(np.random.randn(5,3),index=list(abcde),columns=one,two,three)df3onetwothreea-0.204225-0.402101-0.528857b0.070463-1.203973-1.271088c-1.2108560.4385071.442583d-0.1015211.283724-0.101034e-1.256007-0.112633-1.590732,8.2.2DataFrame,此外,也可以从表格型数据文件中读取数据生成DataFrame。
pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,其中常用的函数包括read_csv()和read_table(),具体用法如下:
importpandasaspdfrompandasimportDataFramecsv_df=pd.read_csv(C:
Python38my_file.csv)table_df=pd.read_table(C:
Python38my_table.txt),8.2.3索引对象,pandas的索引(Index)对象负责管理轴标签和轴名称等。
构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index对象。
Index对象是不可修改的,Series和DataFrame中的索引都是Index对象。
importnumpyasnpimportpandasaspdfrompandasimportSeries,DataFrame,Index#获取Index对象x=Series(range(3),index=a,b,c)index=x.indexindexIndex(a,b,c,dtype=object)index0:
2Index(a,b,dtype=object),8.2.3索引对象,#构造/使用Index对象index=Index(np.arange(3)obj2=Series(2.5,-3.5,0,index=index)obj202.51-3.520.0dtype:
float64obj2.indexisindexTrue#判断列/行索引是否存在data=pop:
2.3,2.6,year:
2020,2021frame=DataFrame(data)framepopyear02.3202012.62021,8.2.3索引对象,popinframe.columnsTrue1inframe.indexTrue,8.3基本功能,8.3.1重新索引8.3.2丢弃指定轴上的项8.3.3索引、选取和过滤8.3.4算术运算8.3.5DataFrame和Series之间的运算8.3.6函数应用和映射8.3.7排序和排名8.3.8分组8.3.9shape函数8.3.10info()函数8.3.11cut()函数,8.3.1重新索引,panda
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 采集 预处理 使用 pandas 进行 清洗