6.2 二进制数据格式

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

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

    pandas内置支持两个二进制数据格式:HDF5和MessagePack。下一节,我会给出几个HDF5的例子,但我建议你尝试下不同的文件格式,看看它们的速度以及是否适合你的分析工作。pandas或NumPy数据的其它存储格式有:

    • bcolz:一种可压缩的列存储二进制格式,基于Blosc压缩库。
    • Feather:我与R语言社区的Hadley Wickham设计的一种跨语言的列存储文件格式。Feather使用了Apache Arrow的列式内存格式。

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

    虽然可以用PyTables或h5py库直接访问HDF5文件,pandas提供了更为高级的接口,可以简化存储Series和DataFrame对象。HDFStore类可以像字典一样,处理低级的细节:

    1. In [92]: frame = pd.DataFrame({'a': np.random.randn(100)})
    2. In [93]: store = pd.HDFStore('mydata.h5')
    3. In [94]: store['obj1'] = frame
    4. In [95]: store['obj1_col'] = frame['a']
    5. In [96]: store
    6. Out[96]:
    7. <class 'pandas.io.pytables.HDFStore'>
    8. File path: mydata.h5
    9. /obj1_col series (shape->[100])
    10. /obj2 frame_table (typ->appendable,nrows->100,ncols->1,indexers->
    11. [index])
    12. /obj3 frame_table (typ->appendable,nrows->100,ncols->1,indexers->
    13. [index])

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

    1. In [98]: store.put('obj2', frame, format='table')
    2. In [99]: store.select('obj2', where=['index >= 10 and index <= 15'])
    3. Out[99]:
    4. a
    5. 10 1.007189
    6. 11 -1.296221
    7. 12 0.274992
    8. 13 0.228913
    9. 14 1.352917
    10. 15 0.886429
    11. In [100]: store.close()

    put是store[‘obj2’] = frame方法的显示版本,允许我们设置其它的选项,比如格式。

    pandas.read_hdf函数可以快捷使用这些工具:

    1. In [101]: frame.to_hdf('mydata.h5', 'obj3', format='table')
    2. a
    3. 0 -0.204708
    4. 1 0.478943
    5. 2 -0.519439
    6. 3 -0.555730
    7. 4 1.965781

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

    读取Microsoft Excel文件

    pandas的ExcelFile类或pandas.read_excel函数支持读取存储在Excel 2003(或更高版本)中的表格型数据。这两个工具分别使用扩展包xlrd和openpyxl读取XLS和XLSX文件。你可以用pip或conda安装它们。

    要使用ExcelFile,通过传递xls或xlsx路径创建一个实例:

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

    1. In [105]: pd.read_excel(xlsx, 'Sheet1')
    2. Out[105]:
    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

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

    1. In [106]: frame = pd.read_excel('examples/ex1.xlsx', 'Sheet1')
    2. In [107]: frame
    3. Out[107]:
    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

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