pickle

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

  1. In [21]: frame = pd.read_csv('examples/ex1.csv')
  2. In [22]: frame
  3. Out[22]:
  4. a b c d message
  5. 0 1 2 3 4 hello
  6. 1 5 6 7 8 world
  7. 2 9 10 11 12 foo
  8. In [23]: frame.to_pickle('examples/frame_pickle')

你可以通过pickle直接读取被pickle化的数据,或是使用更为方便的 pandas.read_pickle

  1. In [24]: pd.read_pickle('examples/frame_pickle')
  2. Out[24]:
  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内置支持两个二进制数据格式:HDF5MessagePackpandasNumPy数据的其它存储格式有

  • bcolz: 一种可压缩的列存储二进制文件,基于Blosc压缩裤
  • Feather

    HDF5

    HDF5是一种存储大规模科学数组数据的非常好的文件格式。它可以被作为C标准库,带有许多语言的接口, 如Java、 Python和MATLAB等。 HDF5中的HDF指的是层次型数据格式(hierarchicaldata format)。每个HDF5文件都含有一个文件系统式的节点结构, 它使你能够存储多个数据集支持元数据。与其他简单格式相比,HDF5支持多种压缩器的即时压缩,还能更高效地存储重复模式数据。对于那些非常大的无法直接放入内存的数据集,HDF5就是不错的选择, 因为它可以高效地分块读写
    虽然可以用PyTablesh5py库直接访问HDF5文件,pandas提供了更为高级的接口,可以简化存储Series和DataFrame对象。HDFStore类可以像字典一样, 处理低级的细节 ```python In [26]: frame = pd.DataFrame({‘a’: np.random.randn(100)})

In [27]: store = pd.HDFStore(‘mydata.h5’)

In [28]: store[‘obj1’] = frame

In [29]: store[‘obj1_col’] = frame[‘a’]

In [30]: store Out[30]:

File path: mydata.h5

  1. **HDF5**文件中的对象可以通过与字典一样的API进行获取
  2. ```python
  3. In [31]: store['obj1']
  4. Out[31]:
  5. a
  6. 0 -0.113137
  7. 1 -1.796232
  8. 2 0.567125
  9. 3 -1.271130
  10. 4 -0.266900
  11. .. ...

HDFStore支持两种存储模式,’fixed‘和’table‘。后者通常会更慢,但是支持使用特殊语法进行查询操作

  1. In [32]: store.put('obj2', frame, format='table')
  2. In [33]: store.select('obj2', where=['index >= 10 and index <= 15'])
  3. Out[33]:
  4. a
  5. 10 0.351596
  6. 11 0.797832
  7. 12 0.197668
  8. 13 1.049980
  9. 14 -2.215114
  10. 15 0.976629
  11. In [34]: store.close()

putstore['obj2'] = frame 方法的显示版本,允许我们设置其它的选项,比如格式
pandas.read_hdf 函数可以快捷使用这些工具

  1. In [35]: frame.to_hdf('mydata.h5', 'obj3', format='table')
  2. In [36]: pd.read_hdf('mydata.h5', 'obj3', where=['index < 5'])
  3. Out[36]:
  4. a
  5. 0 -0.113137
  6. 1 -1.796232
  7. 2 0.567125
  8. 3 -1.271130
  9. 4 -0.266900

笔记: 如果你要处理的数据位于远程服务器,比如Amazon S3或HDFS,使用专门为分布式存储(比如Apache Parquet) 的二进制格式也许更加合适

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

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

Excel

  1. In [38]: xlsx = pd.ExcelFile('examples/ex1.xlsx')

存储在表单中的数据可以read_excel 读取到DataFrame(原书这里写的是用parse解析,但代码中用的是read_excel ,是个笔误:只换了代码,没有改文字)

  1. In [39]: pd.read_excel(xlsx, 'Sheet1')
  2. Out[39]:
  3. Unnamed: 0 a b c d message
  4. 0 0 1 2 3 4 hello
  5. 1 1 5 6 7 8 world
  6. 2 2 9 10 11 12 foo

如果要读取一个文件中的多个表单,创建ExcelFile 会更快,但你也可以将文件名传递到 pandas.read_excel

  1. In [40]: frame = pd.read_excel('examples/ex1.xlsx', 'Sheet1')
  2. In [41]: frame
  3. Out[41]:
  4. Unnamed: 0 a b c d message
  5. 0 0 1 2 3 4 hello
  6. 1 1 5 6 7 8 world
  7. 2 2 9 10 11 12 foo

如果要将pandas数据写入为Excel格式,你必须首先创建一个ExcelWriter ,然后使用pandas对象的to_excel 方法将数据写入到其中

  1. In [42]: writer = pd.ExcelWriter('examples/ex2.xlsx')
  2. In [43]: frame.to_excel(writer, 'Sheet1')
  3. In [44]: writer.save()

你还可以不使用ExcelWriter ,而是传递文件的路径到 to_excel

  1. In [46]: frame.to_excel('examples/ex2.xlsx')