利用Python进行数据分析笔记(数据载入、存储及文件格式--文本格式数据的读写)

  • 访问数据时使用本书中各类工具所必须的第一步。本文将重点关注使用pandas进行数据输入和输出,尽管其他库中有许多工具可帮助读取和写入各种格式的数据。
  • 输入和输出通常有以下几种类型:读取文本文件及硬盘上其他更高效的格式文件、从数据库载入数据、与网络资源进行交互(比如Web API)。
  • 将表格型数据读取为DataFrame对象是pandas的重要特性。表6-1总结了部分实现该功能的函数,read_csv和read_table可能是后期我们使用最多的函数。
    在这里插入图片描述
  • 我会解释这些函数将文本数据转换为DataFrame的机制,这些函数的可选参数主要有以下几种类型。
  • 索引
  • 可以将一或多个列作为返回的DataFrame,从文件或用户处获得列名,或者没有列名。
  • 类型推断和数据转换
  • 包括用户自定义的值转换和自定义的缺失值符号列表。
  • 日期时间解析
  • 包括组合功能,也包括将分散在多个列上的日期和时间信息组合成结果中的单个列。
  • 迭代
  • 支持对大型文件的分块迭代。
  • 未清洗数据问题
  • 跳过行、页脚、注释以及其他次要数据,比如使用逗号分隔千位的数字。
  • 由于现实世界中的数据非常混乱,随着时间推移,一些数据加载函数(尤其是read_csv)的可选参数变得非常复杂。面对大量不同的参数,感到困难是正常的(read_csv在撰写本书时已经有超过50个参数了)。pandas的在线文档有大量示例展示这些参数是如何工作的。如果你在读取某个文件时遇到了困难,在文档中可能会有相似的示例帮助你找到正确的参数。
  • 一些数据载入函数,比如pandas.read_csv,会进行类型推断,因为列的数据类型并不是数据格式的一部分。那就意味着你不必指定哪一列是数值、整数、布尔值或字符串。其他的数据格式,比如HDF5、Feather和msgpack在格式中已经存储了数据类型。
  • 处理日期和其他自定义类型可能需要额外的努力。让我们从一个小型的逗号分隔文本文件(CSV)开始:
    在这里插入图片描述
  • 由于这个文件是逗号分隔的,我们可以使用read_csv将它读入一个DataFrame:
    在这里插入图片描述
  • 我们也可以使用read_table,并指定分隔符:
    在这里插入图片描述
  • 有的文件并不包含表头行。考虑以下文件:
    在这里插入图片描述
  • 要读取文件,你需要选择一些选项。你可以允许pandas自动分配默认列名,也可以自己指定列名:
    在这里插入图片描述
  • 假设你想要message列成为返回DataFrame的索引,你可以指定位置4的列为索引,或将‘message’传给参数index_col:
    在这里插入图片描述
  • 当你想要从多个列中形成一个分层索引,需要传入包含列序号或列名的列表:
    在这里插入图片描述
  • 在某些情况下,一张表的分隔符并不是固定的,使用空白或其他方式来分隔字段。考虑如下文本文件:
    在这里插入图片描述
  • 当字段是以多种不同数量的空格分开时,尽管你可以手工处理,但在这些情况下也可以向read_table传入一个正则表达式作为分隔符。在本例中,正则表达式为\s+,因此我们可以得到:
    在这里插入图片描述
  • 本例中,由于列名的数量比数据的列数少一个,因此read_table推断第一列应当作为DataFrame的索引。
  • 解析函数有很多附加参数帮助你处理各种发生异常的文件格式(表6-2列举了一部分)。例如,你可以使用skiprows来跳过第一行、第三行和第四行:
    在这里插入图片描述
  • 用jup和记事本写的脚本在jup中输入该命令时中文都出现了乱码,之后用Geany编写脚本再在Jup中输入命令,结果如下
    在这里插入图片描述
    在这里插入图片描述
  • 缺失值处理是文件解析过程中一个重要且常常微妙的部分。通常情况下,缺失值要么不显示(空字符串),要么用一些常见的标识,例如NA和NULL:
    在这里插入图片描述
    在这里插入图片描述
  • na_values选项可以传入一个列表或一组字符串来处理缺失值:
    在这里插入图片描述
  • 在字典中,每列可以指定不同的缺失值标识:
    在这里插入图片描述
  • 表6-2列举了pandas.read_csv和pandas.read_table中常用的选项。
    在这里插入图片描述

分块读入文本文件

  • 当处理大型文件或找出正确的参数集来正确处理大文件时,你可能需要读入文件的一个小片段或者按小块遍历文件。
  • 在尝试大文件之前,我们可以先对pandas的显示设置进行调整,使之更为紧凑:
    在这里插入图片描述

将数据写入文本格式

  • 数据可以导出为分隔的形式。让我们看下之前读取的CSV文件:
    在这里插入图片描述
  • 使用DataFrame的to_csv方法,我们可以将数据导出为逗号分隔的文件:
    在这里插入图片描述
  • 当然,其他的分隔符也是可以的(写入到sys.stdout时,控制台中打印的文本结果):
    在这里插入图片描述
  • 缺失值在输出时以空字符出现。你也许想要用其他标识值对缺失值进行标注:
    在这里插入图片描述
  • 如果没有其他选项被指定的话,行和列的标签都会被写入。不过二者也都可以禁止写入:
    在这里插入图片描述
  • 你也可以仅写入列的子集,并且按照你选择的顺序写入:
    在这里插入图片描述
  • Series也有to_csv方法:
    在这里插入图片描述

使用分隔格式

  • 绝大多数的表型数据都可以使用函数pandas.read_table从硬盘中读取。然而,在某些情况下,一些手动操作可能是必不可少的。接收一个带有一行或多行错误的文件并不少见,read_table也无法解决这种情况。为了介绍一些基础工具,考虑如下的小型CSV文件:
    在这里插入图片描述
  • 对于任何带有单字符分隔符的文件,你可以使用Python的内建csv模块。要是用它,需要将任意打开的文件或文件型对象传给csv.reader:
    在这里插入图片描述
  • 像遍历文件那样遍历reader会产生元组,元组的值为删除了引号的字符:
    在这里插入图片描述
  • 之后,你就可以自行做一些必要处理,以将数据整理为你需要的形式,让我们按部就班,首先将文件读取为行的列表:
    在这里插入图片描述
  • 然后,我们将数据拆分为列名行和数据行:
    在这里插入图片描述
  • 再然后,我们使用字典推导式和表达式zip(*values)生成一个包含数据列的字典,字典中行转置为列:
    在这里插入图片描述

JSON数据

  • JSON(JavaScript Object Notation的简写)已经成为Web浏览器和其他应用间通过HTTP请求发送数据的标准格式。它是一种比CSV等表格文件形式更为自由的数据格式。请看下面的例子:
    在这里插入图片描述
  • JSON非常接近有效的Python代码,除了他的空值null和一些其他的细微差别(例如不允许列表末尾的逗号)之外。基本类型是对象(字典)、数组(列表)、字符串、数字、布尔值和空值。有几个Python库用于读写JSON数据。我将在这里使用json,因为它是内置在Python标准库中的。将JSON字符串转换为Python形式时,使用json.loads方法:
    在这里插入图片描述
  • 另一方面,json.dumps可以将Python对象转换为JSON:
    在这里插入图片描述
  • 你将自行决定如何将JSON对象或对象列表转换为DataFrame或其他数据结构。比较方便的方式时间字典构成的列表(之前是JSON对象)传入DataFrame构造函数,并选出数据字段的子集:
    在这里插入图片描述
  • pandas.read_json可以自动将JSON数据集按照指定次序转换为Series或DataFrame。例如:
    在这里插入图片描述
  • pandas.read_json的默认选项是假设JSON数组中的每个对象是表里的一行:
    在这里插入图片描述
  • 如果你需要从pandas中将数据导出为JSON,一种办法是对Series和DataFrame使用to_json方法:
    在这里插入图片描述
    在这里插入图片描述

XML和HTML:网络抓取

  • Python拥有很多可以对HTML和XML格式进行读取、写入数据的库,例如lxml、Beautiful Soup和html5lib。尽管lxml是相对更快的库,但其他库可以更好地处理异常的HTML和XML文件。
  • pandas的内建函数read_html可以使用lxml和Beautiful Soup等库将HTML中的表自动解析为DataFrame对象。为了展示这个功能,我从美国FDIC政府机构下载了显示银行倒闭数据的HTML文件(在pandas文档中使用)。首先,你必须安装read_html所使用的附加库:
conda install lxml
pip install beautifulsoup4 html5lib

使用lxml.objectify解析XML

  • XML(eXtensible Markup Lauguage)是另一种常用的结构化数据格式,它使用元数据支持分层、嵌套数据。本书实际上也是从一系列大型XML文档中生成的。
  • 这里我将用一个例子展示如何使用lxml从更为通用的XML格式解析数据。
  • 纽约大都会交通局(MTA)发不了一份关于其公交、火车服务(http://www.mta.info/developers/down load html)的数据集。
  • 该数据集并没有成功找到,后续的事情也无法开展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值