二进制数据格式

实现数据的二进制格式存储最简单的办法之一是使用Python内置的pickle序列化。为了使用方便,pandas对象都有一个用于将数据以pickle形式保存到磁盘上的save方法:

  1. In [933]: frame = pd.read_csv('ch06/ex1.csv')
  2.  
  3. In [934]: frame
  4. Out[934]:
  5. a b c d message
  6. 0 1 2 3 4 hello
  7. 1 5 6 7 8 world
  8. 2 9 10 11 12 foo
  9. In [935]: frame.save('ch06/frame_pickle')

你可以通过另一个也很好用的pickle函数pandas.load将数据读回到Python:

  1. In [936]: pd.load('ch06/frame_pickle')
  2. Out[936]:
  3. a b c d message
  4. 0 1 2 3 4 hello
  5. 1 5 6 7 8 world
  6. 2 9 10 11 12 foo

警告: pickle仅建议用于短期存储格式。其原因是很难保证该格式永远是稳定的;今天pickle的对象可能无法被后续版本的库unpickle出来。虽然我尽力保证这种事情不会发生在pandas中,但是今后的某个时候说不定还是得“打破”该pickle格式。

使用HDF5格式

很多工具都能实现高效读写磁盘上以二进制格式存储的科学数据。HDF5就是其中一个流行的工业级库,它是一个C库,带有许多语言的接口,如Java、Python和MATLAB等。HDF5中的HDF指的是层次型数据格式(hierarchical data format)。每个HDF5文件都含有一个文件系统式的节点结构,它使你能够存储多个数据集并支持元数据。与其他简单格式相比,HDF5支持多种压缩器的即时压缩,还能更高效地存储重复模式数据。对于那些非常大的无法直接放入内存的数据集,HDF5就是不错的选择,因为它可以高效地分块读写。

Python中的HDF5库有两个接口(即PyTables和h5py),它们各自采取了不同的问题解决方式。h5py提供了一种直接而高级的HDF5API访问接口,而PyTables则抽象了HDF5的许多细节以提供多种灵活的数据容器、表索引、查询功能以及对核外计算技术(out-of-core computation)的某些支持。

pandas有一个最小化的类似于字典的HDFStore类,它通过PyTables存储pandas对象:

  1. In [937]: store = pd.HDFStore('mydata.h5')
  2.  
  3. In [938]: store['obj1'] = frame
  4.  
  5. In [939]: store['obj1_col'] = frame['a']
  6.  
  7. In [940]: store
  8. Out[940]:
  9. <class 'pandas.io.pytables.HDFStore'>
  10. File path: mydata.h5
  11. obj1 DataFrame
  12. obj1_col Series

HDF5文件中的对象可以通过与字典一样的方式进行获取:

  1. In [941]: store['obj1']
  2. Out[941]:
  3. a b c d message
  4. 0 1 2 3 4 hello
  5. 1 5 6 7 8 world
  6. 2 9 10 11 12 foo

如果需要处理海量数据,我建议你好好研究一下PyTables和h5py,看看它们能满足你的哪些需求。由于许多数据分析问题都是IO密集型(而不是CPU密集型),利用HDF5这样的工具能显著提升应用程序的效率。

警告: HDF5不是数据库。它最适合用作“一次写多次读”的数据集。虽然数据可以在任何时候被添加到文件中,但如果同时发生多个写操作,文件就可能会被破坏。

读取Microsoft Excel文件

pandas的ExcelFile类支持读取存储在Excel 2003(或更高版本)中的表格型数据。由于ExcelFile用到了xlrd和openpyxl包,所以你先得安装它们才行。通过传入一个xls或xlsx文件的路径即可创建一个ExcelFile实例:

  1. xls_file = pd.ExcelFile('data.xls')

存放在某个工作表中的数据可以通过parse读取到DataFrame中:

  1. table = xls_file.parse('Sheet1')