
3.7 使用Pandas读写结构化数据
Numpy中的多维数组、矩阵等对象具备极高的执行效率。但是在商业数据分析中,我们不仅需要数据,还需要了解各行、列的意义,同时会针对结构化数据进行相关计算。这些是Numpy库不具备的。为了方便分析,研究者们开发了Pandas,以便简化对结构化数据的操作。
Pandas是一个基于Numpy库开发的更高级的结构化数据分析工具,提供了Series、DataFrame、Panel等数据结构,可以很方便地对序列、截面数据(二维表)、面板数据进行处理。DataFrame是我们常见的二维数据表,包含多个变量(列)和样本(行),通常被称为数据框。Series是一个一维结构的序列,包含指定的索引信息,可以被视作DataFrame中的一列或一行。其操作方法与DataFrame十分相似。Panel是包含序列及截面信息的三维结构,通常被称为面板数据。我们可通过限定时间ID和样本ID获得对应的Series和DataFrame。
由于这些对象的常用操作方法十分相似,因此本节读/写数据以及后续章节对数据的操作主要使用DataFrame进行演示。
3.7.1 读数据
1. 读取文件
Pandas库提供了便捷读取本地结构化数据的方法。这里主要以csv数据为例,read_csv函数可以读取csv数据,代码如下:
>import pandas as pd >csv = pd.read_csv('data/sample.csv') >csv id name scores 0 1 小明 78.0 1 2 小红 87.0 2 3 小白 99.0 3 4 小青 99999.0 4 5 小兰 NaN
按照惯例,Pandas会以pd为别名,以read_csv函数读取指定路径下的文件,然后返回一个DataFrame对象。如果在命令行中打印DataFrame对象,可读性可能会略差一些;如果在Jupyter Notebook中打印的话,可读性会大幅提升,如图3-9所示。

图3-9 Jupyter Notebook中的DataFrame对象
打印出来的DataFrame包含索引(第一列),列名(第一行)及数据内容(除第一行和第一列之外的部分)。
此外,read_csv函数有很多参数可以设置,如表3-4所示。
表3-4 read_csv参数一览

Pandas除了可以直接读取csv、excel、json、html等文件生成的DataFrame,也可以在列表、元组、字典等数据结构中创建DataFrame。
2. 读取指定行和指定列
使用参数usecol和nrows读取指定的列和前n行,这样可以加快数据读取速度。读取原数据的两列、两行示例如下。
>csv = pd.read_csv('data/sample.csv',\ usecols=['id','name'],\ nrows=2) #读取'id'和'name'两列,仅读取前两行 >csv id name 0 1 小明 1 2 小红
3. 分块读取
参数chunksize可以指定分块读取的行数,并返回一个可迭代对象。这里,big.csv是一个4500行、4列的csv数据,设定chunksize=900,分5块读取数据,每块900行,4个变量,如下所示:
>csvs = pd.read_csv('data/big.csv',chunksize=900) >for i in csvs: > print (i.shape) (900, 4) (900, 4) (900, 4) (900, 4) (900, 4)
可以使用pd.concat函数读取全部数据:
>csvs = pd.read_csv('data/big.csv',chunksize=900) >dat = pd.concat(csvs,ignore_index=True) >dat.shape (4500, 4)
4. 将不合理数据读取为缺失值
在数据sample.csv中,“小青”的分数中有的取值为99999,这里令其读取为缺失值,操作如下:
>csv = pd.read_csv('data/sample.csv', na_values='99999') >csv id name scores 0 1 小明 78.0 1 2 小红 87.0 2 3 小白 99.0 3 4 小青 NaN 4 5 小兰 NaN
5. 以指定编码方式读取
读取数据时,乱码情况经常出现。这里需要先弄清楚原始数据的编码形式,再以指定的编码形式读取[4],例如sample.csv编码为UTF-8,这里以指定编码(参数encoding)方式读取。
>csv = pd.read_csv('data/sample.csv', encoding='utf-8') >csv id name scores 0 1 小明 78.0 1 2 小红 87.0 2 3 小白 99.0 3 4 小青 99999.0 4 5 小兰 NaN
3.7.2 写数据
Pandas的DateFrame对象内置了很多方法,其中方法to_csv可以将DateFrame对象以csv格式写入本地。to_csv方法的常见参数如表3-5所示。
表3-5 to_csv方法的常见参数

在以下代码中,data/write.csv表示写入数据的路径,encoding = 'utf-8'表示以UTF-8编码方式输出,index=False表示不输出索引列。
>csv.to_csv('data/write.csv',encoding ='utf-8',index=False)
[1]Anaconda官方网站:https://www.continuum.io/downloads/。
[2]Jupyter Notebook官方指导手册:https://jupyter.readthedocs.io/en/latest/index.html。
[3]Spyder官方指导手册:https://Pythonhosted.org/spyder/。
[4]Python编码格式参考https://docs.Python.org/3/library/codecs.html#standard-encodings。