1、数据预处理-第七章基于Python导入与导出数据目录01020304Pandas文本文件导入与导出二进制文件导入与导出数据库导入与导出01PandasPandas 阶段1:Pandas 阶段2:Series 阶段3:DataFramePandas官方的解释:pandas是一个基于BSD开源协议的开源库,提供了用于python编程语言的高性能、易于使用的数据结构和数据分析工具。Pandaspandas适用于以下多种类型的数据n 表格型的数据,且表格的各列可能具有不同的数据类型,例如关系型数据库表格,或者Excel表格数据n 有序或无序的时间序列数据n 带有行和列标签的矩阵数据n 各种统计/观测数
2、据集 PandasAnaconda 下:conda install pandasPIP 下:pip install pandas(推荐)Pandas的安装Pandasimport pandas as 别名 如 import pandas as pd Python代码中pandas的引入方法PandasPandas提供了两种主要的数据结构n Series:用于处理一维数据n DataFrame。用于处理二维数据。SeriesSeries是一种类似于数组的一维数据结构,包含了一系列的元素以及元素对应的标签。元素的标签称为index。1A2B3C4Dindex什么是一维数据?Seriesfrom p
3、andas import Series as 别名单独引入Series数据结构的方法pandas.SeriesPandas中Series数据结构的使用Series可以基于一个list构造一个 s=Series(3,8,-5,1)In 1:from pandas import SeriesIn 2:s=Series(3,8,-5,1)In 3:sOut4:0 31 82 -53 1dtype:int64Series访问Series对象的values属性和index属性In 6:s.valuesOut6:array(3,8,-5,1)In 7:s.indexOut7:RangeIndex(star
4、t=0,stop=4,step=1)Series创建Series对象的指定index In 8:s2=Series(3,8,-5,1,index=a,b,c,d)In 9:s2Out9:a 3b 8c -5d 1dtype:int64 In 10:s2.indexOut10:Index(a,b,c,d,dtype=object)Series访问单个元素值,使用类似list访问元素的语法 In 11:s22Out11:-5 In 12:s2cOut12:-5Series通过index列表选择Series对象的多个元素值In 16:s2c,a,dOut16:c -5a 3d 1dtype:int6
5、4SeriesSeries对象可以和一个实数做算术运算In 17:s2*3Out17:a 9b 24c -15d 3 dtype:int64SeriesSeries对象和一个实数做逻辑运算,Series对象的元素返回bool类型。In 18:s2 0Out18:a Trueb Truec Falsed Truedtype:boolSeries使用BOOL序列过滤Series对象。In 19:s2s20Out19:a 3b 8d 1dtype:int64SeriesIn 21:a in s2Out21:True In 22:x in s2Out22:False许多map的操作可以应用在Serie
6、s上 SeriesSeries对象value通过赋值能够改变 In 25:s2b=2In 26:s2Out26:a 3b 2c -5d 1dtype:int64SeriesSeries对象的index也可以通过赋值来改变 In 27:s2.index=list(wxyz)In 28:s2Out28:w 3x 8y -5z 1dtype:int64Series基于字典(Dictionary)也能够创建Series对象 In 23:s3=Series(a:1,b:2,c:3)In 24:s3Out24:a 1b 2c 3dtype:int64DataFrameDataFrame是一种带标签的二维数
7、据结构,其中各列可以存储不同的数据类型。序号标题abc1230.10.20.3ABC123DataFramefrom pandas import DataFrame as 别名Python代码中引入DataFrame方法数据来源In 31:data=int_column:1,2,3,.:float_column:3.3,5.5,6.6,.:string_column:aaa,bbb,cccIn 32:df=DataFrame(data)In 33:dfOut33:float_column int_column string_column0 3.3 1 aaa1 5.5 2 bbb2 6.6 3
8、 ccc基于字典构造一个DataFrame对象DataFrameDataFrame的各列是有序排列的,可以在创建的时候传递columns参数调整顺序。而index参数则为每一行指定了一个index。DataFrame(data,columns=列名称列表,index=索引名称列表 )DataFrameIn 44:df=DataFrame(.:data,.:columns=string_column,int_column,float_column,na_column,.:index=a,b,c)In 45:dfOut45:string_column int_column float_column
9、 na_columna aaa 1 3.3 NaNb bbb 2 5.5 NaNc ccc 3 6.6 NaNDataFrame获取DataFrame对象的一列,返回Series对象 In 46:c=dffloat_column 或者 df.float_columnsIn 47:type(c)Out47:pandas.core.series.Series In 48:cOut48:a 3.3b 5.5c 6.6Name:float_column,dtype:float64DataFrameDataFrame对象具有一些基本的统计方法,它们是按列进行计算的,返回的结果是一个Series对象。In
10、 6:df.mean()Out6:int_column 2.000000float_column 5.133333dtype:float64 In 7:df.sum()Out7:string_column aaabbbcccint_column 6float_column 15.4na_column Nonedtype:object计算每列的均值计算每列之和DataFrameDataFrame对象之间也可以进行一些基本计算,是以列名找出匹配的列进行计算,例如加法运算。In 9:df1=DataFrame(a:1,2,3,b:4,5,6,c:7,8,9)In 10:df2=DataFrame(d
11、:10,20,30,b:40,50,60,c:70,80,90)In 11:df1+df2Out11:a b c d0 NaN 44 77 NaN1 NaN 55 88 NaN2 NaN 66 99 NaN小结本章节知识点n Pandasn Seriesn DataFrame02文本文件导入与导出文本文件导入与导出 阶段1:CSV文件导入 阶段2:CSV文件导出 阶段3:JSON格式文件导入与导出CSV文件导入csv,即comma-separated values,表示以逗号分隔的值。csv文件是一种比较简单的文本格式,广泛用于存储表格式的行列数据,可以直接使用excel软件打开。pandas
12、提供了read_csv函数,用于导入csv文件,并得到一个DataFrame对象。此外,还提供了read_table函数,能够进一步导入使用其他分隔符的类csv文件。CSV文件导入a,b,c,d,message1,2,3,4,hello5,6,7,8,world9,10,11,12,footest1.csv数据源示例1CSV文件导入In 5:df=pandas.read_csv(test1.csv)In 6:dfOut6:a b c d message0 1 2 3 4 hello1 5 6 7 8 world2 9 10 11 12 fooread_csv函数的使用CSV文件导入In 7:d
13、f=pandas.read_table(test1.csv,sep=,)In 8:dfOut8:a b c d message0 1 2 3 4 hello1 5 6 7 8 world2 9 10 11 12 fooread_table函数的使用CSV文件导入1,2,3,4,hello5,6,7,8,world9,10,11,12,footest2.csv数据源示例2CSV文件导入In 10:pandas.read_csv(test2.csv,header=None)Out10:0 1 2 3 40 1 2 3 4 hello1 5 6 7 8 world2 9 10 11 12 foocs
14、v文件没有名称行 CSV文件导入read_csv函数提供“names”参数设置列标签名称。In 11:pandas.read_csv(test2.csv,names=a,b,c,d,message)Out11:a b c d message0 1 2 3 4 hello1 5 6 7 8 world2 9 10 11 12 fooCSV文件导入假如希望让message列成为DataFrame对象的index,可以使用index_col参数。In 12:names=a,b,c,d,message In 13:pandas.read_csv(test2.csv,names=names,index_
15、col=message)Out13:a b c dmessage hello 1 2 3 4world 5 6 7 8foo 9 10 11 12CSV文件导入 A B Caaa -0.264438 -1.026059 -0.619500bbb 0.927272 0.302904 -0.032399ccc -0.264273 -0.386314 -0.217601ddd -0.871858 -0.348382 1.100491test3.csv数据源示例3CSV文件导入In 16:pandas.read_table(test3.csv,sep=s+)Out16:A B Caaa-0.26443
16、8-1.026059-0.619500bbb 0.927272 0.302904-0.032399ccc-0.264273-0.386314-0.217601ddd-0.871858-0.348382 1.100491一个或多个空格可以使用正则表达式来表述:s+CSV文件导入使用skiprows参数忽略行 In 19:pandas.read_csv(test3.csv,sep=s+,skiprows=1)Out19:A B Cbbb 0.927272 0.302904-0.032399ccc -0.264273-0.386314-0.217601ddd -0.871858-0.348382 1
17、.100491CSV文件导入使用nrows参数可以控制读入的行数 In 19:pandas.read_csv(test3.csv,sep=s+,nrows=3)Out19:A B Caaa -0.264438-1.026059-0.619500bbb 0.927272 0.302904-0.032399ccc -0.264273-0.386314-0.217601CSV文件导入参数:filepath_or_buffer:表示文件系统位置、URL、文件型对象的字符串sep或delimiter:用于对行中各字段进行拆分的字符序列或正则表达式r,t,多种分隔符时使用s+header:用作列名的行号。
18、默认为0(第一行),如果没有header行就应该设置为Noneindex_col:用作行索引的列编号或列名。可以是单个名称/数字或由多个名称/数字组成的列表(层次化索引)names:用于结果的列名列表,结合header=Noneskiprows:需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)skip_footer:需要忽略的行数(从文件末尾处算起)na_values:将这个值替换成NAnrows:需要读取的行数(从文件开始处算起)encoding:用于unicode文本编码格式。Python2默认“ascii”python3默认“utf-8”thousands:千分位分隔
19、符,如,或“.”Pandas.read_csv/read_table常用参数列表CSV文件导入参数详情参考:http:/pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html#pandas.read_csvCSV文件导出to_csv()将DataFrame导出为csv格式的文件to_csv()是DataFrame类的方法read_csv()是pandas类的方法CSV文件导出数据源示例4something,a,b,c,d,messageone,1,2,3,4,two,5,6,8,worldthree,9,10,11
20、,12,footest4.csvCSV文件导出读取test4.csv文件In 27:data=pandas.read_csv(test4.csv)In 28:dataOut28:something a b c d message0 one 1 2 3.0 4 NaN1 two 5 6 NaN 8 world2 three 9 10 11.0 12 fooCSV文件导出导出data数据到csv文件In 30:data.to_csv(out4.csv)查看out4.csv,something,a,b,c,d,message0,one,1,2,3.0,4,1,two,5,6,8,world2,thr
21、ee,9,10,11.0,12,fooCSV文件导出使用sep参数自定义分隔符In 33:data.to_csv(out4.csv,sep=|)查看out4.csv|something|a|b|c|d|message0|one|1|2|3.0|4|1|two|5|6|8|world2|three|9|10|11.0|12|fooCSV文件导出使用na_rep参数自定义空值In 36:data.to_csv(out4.csv,sep=|,na_rep=None)查看out4.csv|something|a|b|c|d|message0|one|1|2|3.0|4|None1|two|5|6|No
22、ne|8|world2|three|9|10|11.0|12|fooCSV文件导出index过滤索引 header过滤列标签In 44:data.to_csv(out4.csv,sep=|,.:na_rep=None,index=False,header=False).:查看out4.csvone|1|2|3.0|4|Nonetwo|5|6|None|8|worldthree|9|10|11.0|12|fooCSV文件导出Columns筛选导出的列In 44:data.to_csv(out4.csv,sep=|,.:na_rep=None,index=False,header=False,.:
23、columns=a,b,c).:查看out4.csv1|2|3.05|6|None9|10|11.0JSON格式数据的导入与导出JSON(JavaScript Object Notation)在Web中使用非常广泛,常用于前端网页的JavaScript脚本和后端Web服务器交换数据。和表格型的数据比较起来,JSON格式更加复杂和灵活,能够表达类似于树结构的数据。JSON格式数据的导入与导出使用Python语言内置的json模块In 42:import jsonJSON格式数据的导入load函数导入json数据,返回dict对象。In 43:with open(in.json)as f:.:j=
24、json.load(f)JSON格式数据的导入In 44:jOut44:menu:id:file,popup:menuitem:onclick:CreateNewDoc(),value:New,onclick:OpenDoc(),value:Open,onclick:CloseDoc(),value:Close,value:File In 45:type(j)Out45:dictJSON格式数据的导出dump函数提供了与load反向的功能,将一个dict对象导出为JSON格式的文件。In 46:with open(out.json,w)as f:.:json.dump(j,f)JSON格式数据
25、的导出查看out.json文件内容:menu:id:file,value:File,popup:menuitem:value:New,onclick:CreateNewDoc(),value:Open,onclick:OpenDoc(),value:Close,onclick:CloseDoc()小结本章节知识点n CSV文件导入与导出n JSON文件的导入与导出03二进制文件导入与导出二进制文件导入与导出 阶段1:EXCEL文件导入 阶段2:导出EXCEL文件EXCEL文件导入pandas通过ExcelFile类型提供了对Excel文件的基本支持。ExcelFile类在内部使用xlrd 和o
26、penpyxl包来操作Excel文件。EXCEL文件导入首先需要创建ExcelFile类的实例xls=pandas.ExcelFile(mydata.xls)假设该文件中存在一个名为“mysheet”的表格,使用ExcelFile对象的parse方法来解析它,从而获得一个DataFrame对象。df=xls.parse(mysheet)此后,就可以按常规方式使用df了。EXCEL文件导出导出Excel文件to_excel()方法pandas.DataFrame(df).to_excel(abc.xlsx,sheet_name=123,index=False,header=True)小结本章节知
27、识点n 二进制文件Excel的导入与导出04数据库导入与导出数据库的导入与导出 阶段1:关系型数据库的导入与导出 sqlite3 mysql 阶段2:非关系型数据库的导入与导出 MongoDB关系型数据库的导入与导出sqlite3数据库sqlite3是一个嵌入式数据库,数据库文件就是一个db文件,如果第一次执行就会发现在当前文件夹下多了一个*.db文件,这就是嵌入式数据库文件。如果我们把数据保存到内存中,程序结束后就消失,那么使用:memory:作为数据库名称。关系型数据库的导入与导出#导入SQLite驱动:In 1:import sqlite3#连接到SQLite数据库#数据库文件是test
28、.db#如果文件不存在,会自动在当前目录创建:In 2:conn=sqlite3.connect(test.db)关系型数据库的导入与导出#创建一个Cursor:In 3:cursor=conn.cursor()#执行一条SQL语句,创建user表:In 4:cursor.execute(create table user(id int primary key,name varchar(20)Out4:关系型数据库的导入与导出#继续执行一条SQL语句,插入一条记录:In 5:cursor.execute(insert into user(id,name)values(1,Michael)Out
29、5:#通过rowcount获得插入的行数:In 6:cursor.rowcount Out6:1 关系型数据库的导入与导出#继续执行一条SQL语句,插入多条记录:In 7:cursor.executemany(insert into user(id,name)values(?,?),(2,AAA),(3,BBB)Out 7:#通过rowcount获得插入的行数:In 8:cursor.rowcount 2 关系型数据库的导入与导出#关闭Cursor:In 9:cursor.close()#提交事务:In 10:mit()#关闭Connection:#如果使用“:memory:”作为数据库,在关
30、闭Connection#后数据库将消失,无法再次连接使用原来的表和表记录In 11:conn.close()关系型数据库的导入与导出#假设前面的conn没有关闭In 12:cursor=conn.cursor()#执行查询语句:In 13:cursor.execute(select*from test where id=?,(1,)Out 13:#获得查询结果集:In 14:values=cursor.fetchall()In 15:valuesOut 15:(1,Michael),(2,AAA),(3,BBB)关系型数据库的导入与导出In 1:import sqlite3 In 2:impo
31、rt pandas.io.sql as sqlIn 3:conn=sqlite3.connect(test.db)In 4:data=sql.read_sql_query(select*from user,conn)In 5:conn.close()pandas.io.sql提供了一个便捷的方法完成同样的任务,返回DataFrame对象。关系型数据库的导入与导出MySQL数据库 需要确保 pymysql 已安装。安装方法n Anaconda安装:$conda install pymysqln Pip安装:$pip install pymysqln 使用 git 命令下载安装包安装(你也可以手动
32、下载):$git clone https:/ PyMySQL/$python3 setup.py install关系型数据库的导入与导出In 1:import pymysql#创建数据库连接对象In 2:con=pymysql.connect(数据库地址,用户名,密码,数据库名称)sqlite3的占位符是?,而PyMySQL的占位符是%s非关系型数据库的导入与导出非关系型数据库,又称为NoSQL数据库,描述的是大量结构化数据存储方法的集合NoSQL=Not Only SQL 不仅仅是SQL”主要将NOSQL分为以下几类:Column-Oriented(列存储)Key-Value(键值)Docu
33、ment-Oriented(文档存储)优点:易扩展 高性能 数据类型灵活 高可用非关系型数据库的导入与导出MongoDB数据库 MongoDB是一种广泛使用的NoSQL数据库。MongoDB属于文档存储类型,与Key-Value非常相似,Value主要以JSON或者XML等格式。非关系型数据库的导入与导出MongoDB数据库 MongoDB采用了客户-服务器架构,作为用户,首先需要建立与服务端的连接。使用pymongo与MongoDB服务端进行交互,这是MongoDB官方提供的模块,可以通过pip或者Anaconda安装。非关系型数据库的导入与导出启动MongoDB服务端1.创建一个临时使用的
34、存放路径。mkdir-p/tmp/mongodb/testdb2.启动MongoDB服务器程序。mongod-dbpath/tmp/mongodb/testdbMongoDB服务端口:27017 非关系型数据库的导入与导出启动了MongoDB的服务端,下面通过Python的模块pymongo与服务端进行交互,从而实现数据进出MongoDB数据库。#导入客户类In 3:from pymongo import MongoClient#创建MongoDB连接对象In 4:client=MongoClient(localhost,27017)非关系型数据库的导入与导出一个MongoDB连接对象能够支持
35、多个独立的数据库#访问“test-database”数据库In 5:db=clienttest-database#访问test-collection文档#collection是MongoDB数据库中的一种数据结构,#用于表示一组文档(Document)。相当于关系型#数据库中的一张表In 6:collection=dbtest-collection非关系型数据库的导入与导出MongoDB中数据库和collection的使用是惰性的。也就是说,只有当首个文档插入其中的时候,数据库和collection才会真正被创建出来。非关系型数据库的导入与导出例如,下面的代码表示博客中的一篇文章。In 7:i
36、mport datetimeIn 8:post=author:Mike,.:text:My first blog post!,.:tags:mongodb,python,pymongo,.:date:datetime.datetime.utcnow()datetime类型的值在存储时会自动转换为适当的存储格式 非关系型数据库的导入与导出将post数据插入数据库中名为“posts”的collection中。单条插入使用insert_one(数据)方法,并且会自动生成文档的id。In 9:posts=dbpostsIn 10:post_id=posts.insert_one(post).inser
37、ted_idIn 11:post_idOut11:ObjectId(5b1de0e7bf088c02fe72f61f)非关系型数据库的导入与导出#列出数据库中的所有collection。In 12:db.collection_names(include_system_collections=False)Out12:posts非关系型数据库的导入与导出查询数据库中的一篇文档:find_one方法。#使用find_one方法查询posts中的一篇文章。In 13:posts.find_one()Out13:_id:ObjectId(5b1de0e7bf088c02fe72f61f),author:
38、Mike,date:datetime.datetime(2018,6,11,2,36,17,659000),tags:mongodb,python,pymongo,text:My first blog post!上面的代码得到的结果是一个dict,对应于前面插入的那篇文章。可以看到,文档中自动生成了一个名为_id的属性。非关系型数据库的导入与导出数据查找find_one()方法支持过滤条件#查询指定作者的文章。In 14:posts.find_one(author:Mike)Out14:_id:ObjectId(5b1de0e7bf088c02fe72f61f),author:Mike,dat
39、e:datetime.datetime(2018,6,11,2,36,17,659000),tags:mongodb,python,pymongo,text:My first blog post!如果作者不存在,查询结果为空。非关系型数据库的导入与导出使用insert_many()方法进行批量插入insert_many(list)非关系型数据库的导入与导出In 16:new_posts=author:Mike,.:text:Another post!,.:tags:bulk,insert,.:date:datetime.datetime(2009,11,12,11,14),.:author:E
40、liot,.:title:MongoDB is fun,.:text:and pretty easy too!,.:date:datetime.datetime(2009,11,10,10,45)#使用insert_many方法一次性插入In 17:result=posts.insert_many(new_posts)In 18:result.inserted_idsOut18:ObjectId(5b1de96fbf088c02fe72f620),ObjectId(5b1de96fbf088c02fe72f621)非关系型数据库的导入与导出使用find方法查询多条记录find方法返回一个Cursor类型的对象,通过迭代查询所有的结果。#迭代posts中的每一篇文章。In 20:for post in posts.find():.:print(post).:非关系型数据库的导入与导出find方法同样支持dict参数,用于过滤查询结果。In 21:for post in posts.find(author:Mike):.:print(post)非关系型数据库的导入与导出本章节知识点n MongoDB数据库的导入与导出谢谢观看