经过前面文章对NumPy和Pandas库的学习,相信大家已经能掌握基本的数据处理操作,更高级的数据处理操作将在本节之后介绍,像什么数据的清洗、转换、合并、重塑、聚合、分组、可视化等都会介绍给大家。
俗话说,巧妇难为无米之炊,没有数据源,就没法进行数据处理,本节就是讲数据的加载和存储。
进入正题:
输入输出通常可以划分几个大类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据,利用Web API操作网络资源
一、读写文本格式的数据
pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,下表对它们进行了总结,其中read_csv和read_table是今后用的最多的:
read_csv和read_table函数的参数:
1、基本操作
有些表格可能不是用固定的分隔符去分隔字段,可以用正则表达式来作为read_table的分隔符:
对于文件中出现的缺失值处理:默认情况下,pandas会用一组经常出现的标记值进行识别,如NA,-1.#IND、NULL等
2、逐块读取文本文件
在看大文件之前,我们先设置pandas显示地更紧些:
pd.options.display.max_rows = 10
要逐块读取文件需要设置chunksize(行数)
read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代。比如说,我们可以迭代处理ex6.csv,将值计数聚合到"key"列中,如下所示:
3、将数据写到文本格式
用to_csv方法,可以将数据写到一个以逗号分隔的文件中:
写入成功:
写入成功
4、手工处理分隔符文件
大部分存储在磁盘上的表格型数据都能用pandas.read_table进行加载,然而有时还是需要做一些手工处理。例如下面文件:
CSV文件的形式有很多种,只需定义csv.Dialect的一个子类即可定义出新格式(如专门的分隔符,字符串引用约定、行结束符等):
例如:
对于那些使用复杂分隔符或多字符的文件,csv模块无能为力,可以使用字符串的split方法或正则表达式方法re.split进行拆分和其他整理工作。
要手工输出分隔符文件,可以使用csv.writer。它接受一个已打开且可写的文件对象。
5、加载json数据
JSON已经成为通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标准格式之一。
pandas.read_json可以自动将特别格式的JSON数据集转换为Series或DataFrame。如果你需要将数据从pandas输出到JSON,可以使用to_json方法
6、XML和HTML:Web信息收集
Python有许多可以读写常见的HTML和XML格式数据的库,包括lxml、Beautiful Soup和html5lib。lxml的速度比较快,但其它的库处理有误的HTML或XML文件更好。
pandas有一个内置的功能,read_html,它可以使用lxml和Beautiful Soup自动将HTML文件中的表格解析为DataFrame对象。pandas.read_html有一些选项,默认条件下,它会搜索、尝试解析标签内的的表格数据。结果是一个列表的DataFrame对象:
我们可以做一些数据清洗和分析,比如计算按年份计算倒闭的银行数:
7、利用lxml.objectify解析XML
XML(Extensible Markup Language)是另一种常见的支持分层、嵌套数据以及元数据的结构化数据格式。
纽约大都会运输署发布了一些有关其公交和列车服务的数据资料(http://www.mta.info/developers/download.html)。这里,我们将看看包含在一组XML文件中的运行情况数据。每项列车或公交服务都有各自的文件(如Metro-North Railroad的文件是Performance_MNR.xml),其中每条XML记录就是一条月度数据,如下所示:
我们先用lxml.objectify解析该文件,然后通过getroot得到该XML文件的根节点的引用:
XML数据可以比本例复杂得多。每个标记都可以有元数据。看看下面这个HTML的链接标签(它也算是一段有效的XML):
二、二进制数据格式
1、pickle
实现数据的二进制格式存储最简单的办法之一是使用python内置的pickle序列化,为了使用方便,pandas对象都有一个用于将数据以pickle形式保存到磁盘上的save方法。
可以通过pickle直接读取被pickle化的数据,或是使用更为方便的pandas.read_pickle
pickle仅建议用于短期存储格式。
2、HDF5格式
pandas内置支持两个二进制数据格式:HDF5和MessagePack。HDF5是一个流行的工业级库,它是一个C库,带有许多语言的接口。HDF5中HDF指的是层次型数据格式。每个HDF5文件都含有一个文件系统式的节点结构,它使你能够存储多个数据集并支持元数据。与其他简单格式相比,HDF5支持多种压缩器的即时压缩,还能更高效地存储重复模式数据。对于那些非常大的无法直接放人内存的数据集,HDF5就是不错的选择,因为它可以高效地分块读写。
Python中的HDF5库有两个接口(即PyTables和h5py),他们各自采取了不同的问题解决方式。h5py提供了一种直接而高级的HDF5 API访问接口,而PyTables则抽象了HDF5的许多细节以提供多种灵活的数据容器、表索引、查询功能以及对核外计算技术的某些支持。
Pandas有一个最小化的类似于字典的HDFStore类,它通过PyTables存储pandas对象:
HDFStore支持两种存储模式,'fixed'和'table'。后者通常会更慢,但是支持使用特殊语法进行查询操作
put是store['obj2'] = frame方法的显示版本,允许我们设置其它的选项,比如格式。
pandas.read_hdf函数可以快捷使用这些工具:
如果要处理的数据位于远程服务器,比如Amazon S3或HDFS,使用专门为分布式存储(比如Apache Parquet)的二进制格式也许更加合适。Python的Parquet和其它存储格式还在不断的发展之中
如果需要处理本地海量数据,建议好好研究PyTables和h5py。由于许多数据分析问题都是IO密集型(而不是CPU密集型),利用HDF5这样的工具能显著提升应用程序的效率。
3、读取Microsoft Excel文件
pandas的ExcelFile类或pandas.read_excel函数支持读取存储在Excel 2003(或更高版本)中的表格型数据。
要使用ExcelFile,通过传递xls或xlsx路径创建一个实例。如果要读取一个文件中的多个表单,创建ExcelFile会更快,但你也可以将文件名传递到pandas.read_excel。
如果要将pandas数据写入为Excel格式,你必须首先创建一个ExcelWriter,然后使用pandas对象的to_excel方法将数据写入到其中。还可以不使用ExcelWriter,而是传递文件的路径到to_excel。
三、使用Web API加载数据
这个其实是爬虫的相关内容,大家自行学习爬虫的相关库,如requests库,BeautifulSoup库,urllib库,selenium库,Scrapy爬虫框架等。
网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
爬虫用来获取很多数据。相关知识点很多,可以分出一个专业领域。对爬虫感兴趣的可以去专门学习。
搜索最新的30个GitHub上的pandas主题,响应对象的json方法会返回一个包含被解析过的JSON字典,加载到一个Python对象中:
data中的每个元素都是一个包含所有GitHub主题页数据(不包含评论)的字典。我们可以直接传递数据到DataFrame,并提取感兴趣的字段:
四、使用数据库加载数据
在许多应用中,数据库很少取自文本文件,因为这种方式存储大量数据很低效。基于SQL的关系型数据库使用非常广泛,此外还有一些非SQL(即noSQL)型数据库也变得非常流行。
作者:owolf
链接:https://www.jianshu.com/p/914a2df00871