将表格型数据读取为DataFrame对象是pandas的重要特性。下表总结了部分实现该功能的函数,read_csv和read_table可能是后期使用最多的函数。
这些函数的可选参数主要有以下几种类型。
索引:可以将一或多个列作为返回的DataFrame,从文件或用户处获得列名,或者没有列名。
类型推断和数据转换:包括用户自定义的值转换和自定义的缺失值符号列表。
日期时间解析:包括组合功能,也包括将分散在多个列上的日期和时间信息组合成结果中的单个列。
迭代:支持对大型文件的分块迭代。
未清洗数据问题:跳过行、页脚、注释以及其他次要数据,比如使用逗号分隔千位的数字。
由于现实世界中的数据非常混乱,随着时间推移,一些数据加载函数(尤其是read_csv)的可选参数变得非常复杂。pandas的在线文档有大量示例展示这些参数是如何工作的。如果在读取某个文件时遇到了困难,在文档中可能会有相似的示例帮助你找到正确的参数。
一些数据载入函数,比如pandas.read_csv,会进行类型推断,因为列的数据类型并不是数据格式的一部分。那就意味着不必指定哪一列是数值、整数、布尔值或字符串。其他的数据格式,比如HDF5、Feather和msgpack在格式中已经存储了数据类型。
处理日期和其他自定义类型可能需要额外的努力。从一个小型的逗号分隔文本文件(CSV)开始:
由于这个文件是逗号分隔的,我们可以使用read_csv将它读入一个DataFrame:
我们也可以使用read_table,并指定分隔符:
有的文件并不包含表头行。考虑以下文件:
要读取该文件,你需要选择一些选项。你可以允许pandas自动分配默认列名,也可以自己指定列名:
假设想message列成为返回DataFrame的索引,可以指定位置4的列为索引,或将’message’传给参数index_col:
当想要从多个列中形成一个分层索引,需要传入一个包含列序号或列名的列表:
当字段是以多种不同数量的空格分开时,可以向read_table传入一个正则表达式作为分隔符。
缺失值处理是文件解析过程中一个重要且常常微妙的部分。通常情况下,缺失值要么不显示(空字符串),要么用一些标识值。默认情况下,pandas使用一些常见的标识,例如NA和NULL:
na_values选项可以传入一个列表或一组字符串来处理缺失值:
下表列举了pandas.read_csv和pandas.read_table中常用的选项。
当处理大型文件或找出正确的参数集来正确处理大文件时,可能需要读入文件的一个小片段或者按小块遍历文件。在尝试大文件之前,先对pandas的显示设置进行调整,使之更为紧凑:
现在可以得到:
如果只想读取一小部分行(避免读取整个文件),可以指明nrows:
为了分块读入文件,可以指定chunksize作为每一块的行数:
read_csv返回的TextParser对象允许你根据chunksize遍历文件。例如,我们可以遍历ex6.csv,并对’key’列聚合获得计数值:
可以得到:
数据可以导出为分隔的形式。看下之前读取的CSV文件:
使用DataFrame的to_csv方法,我们可以将数据导出为逗号分隔的文件:
其他的分隔符也是可以的(写入到sys.stdout时,控制台中打印的文本结果):
缺失值在输出时以空字符串出现。你也许想要用其他标识值对缺失值进行标注:
如果没有其他选项被指定的话,行和列的标签都会被写入。不过二者也都可以禁止写入:
Series也有to_csv方法:
绝大多数的表型数据都可以使用函数pandas.read_table从硬盘中读取。然而,在某些情况下,一些手动操作可能是必不可少的。接收一个带有一行或多行错误的文件并不少见,read_table也无法解决这种情况。为了介绍一些基础工具,考虑如下的小型CSV文件:
对于任何带有单字符分隔符的文件,你可以使用Python的内建csv模块。要使用它,需要将任一打开的文件或文件型对象传给csv.reader:
像遍历文件那样遍历reader会产生元组,元组的值为删除了引号的字符:
之后,可以自行做一些必要处理,以将数据整理为你需要的形式。
然后,将数据拆分为列名行和数据行:
再然后,使用字典推导式和表达式zip(*values)生成一个包含数据列的字典,字典中行转置成列:
CSV文件有多种不同风格。如需根据不同的分隔符、字符串引用约定或行终止符定义一种新的格式时,可以使用csv.Dialect定义一个简单的子类:
下表中列出了csv.Dialect中的一些属性及其用途。
需要手动写入被分隔的文件时,你可以使用csv.writer。这个函数接收一个已经打开的可写入文件对象以及和csv.reader相同的CSV方言、格式选项:
JSON(JavaScript Object Notation的简写)已经成为Web浏览器和其他应用间通过HTTP请求发送数据的标准格式。它是一种比CSV等表格文本形式更为自由的数据形式。请看下面的例子:
JSON非常接近有效的Python代码,除了它的空值null和一些其他的细微差别(例如不允许列表末尾的逗号)之外。基本类型是对象(字典)、数组(列表)、字符串、数字、布尔值和空值。
另一方面,json.dumps可以将Python对象转换回JSON:
比较方便的将JSON对象或对象列表转换为DataFrame或其他数据结构的方式是将字典构成的列表(之前是JSON对象)传入DataFrame构造函数,并选出数据字段的子集:
pandas.read_json可以自动将JSON数据集按照指定次序转换为Series或DataFrame。
pandas.read_json的默认选项是假设JSON数组中的每个对象是表里的一行:
评论区(0)