Python数据分析 | (20) 二进制数据格式

目录

1. pickle序列化

2. 使用HDF5格式

3. 读取Microsoft Excel文件


1. pickle序列化

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

frame = pd.read_csv('examples/ex1.csv')
print(frame)
frame.to_pickle('examples/frame_pickle')

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

pd.read_pickle('examples/frame_pickle')

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

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

1) bcolz:一种可压缩的列存储二进制格式,基于Blosc压缩库。

2)Feather:R语言社区的Hadley Wickham设计的一种跨语言的列存储文件格式。Feather使用了Apache Arrow的列式内存格式。

2. 使用HDF5格式

HDF5是一种存储大规模科学数组数据的非常好的文件格式。它可以被作为C标准库,带有许多语言的接口,如Java、Python和MATLAB等。HDF5中的HDF指的是层次型数据格式(hierarchical data format)。

每个HDF5文件都 含有一个文件系统式的节点结构,它使你能够存储多个数据集并支持元数 据。与其他简单格式相比,HDF5支持多种压缩器的即时压缩,还能更高效 地存储重复模式数据。对于那些非常大的无法直接放入内存的数据集,HDF5就是不错的选择,因为它可以高效地分块读写。

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

frame = pd.DataFrame({'a': np.random.randn(100)})
store = pd.HDFStore('mydata.h5')
store['obj1'] = frame
store['obj1_col'] = frame['a']
store

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

store['obj1']

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

store.put('obj2', frame, format='table')
print(store.select('obj2', where=['index >= 10 and index <= 15']))
store.close()

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

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

frame.to_hdf('mydata.h5', 'obj3', format='table')
pd.read_hdf('mydata.h5', 'obj3', where=['index < 5'])

如果你要处理的数据位于远程服务器,比如Amazon S3或HDFS,使用专门为分布式存储(比如Apache Parquet)的二进制格式 也许更加合适。Python的Parquet和其它存储格式还在不断的发展之 中,所以没有涉及。

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

移除.h5文件:

import os
os.remove('mydata.h5')

3. 读取Microsoft Excel文件

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

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

xlsx = pd.ExcelFile('examples/ex1.xlsx')

存储在表单中的数据可以read_excel读取到DataFrame:

pd.read_excel(xlsx, 'Sheet1')

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

frame = pd.read_excel('examples/ex1.xlsx', 'Sheet1')
frame

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

writer = pd.ExcelWriter('examples/ex2.xlsx')
frame.to_excel(writer, 'Sheet1')
writer.save()

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

frame.to_excel('examples/ex2.xlsx')

删除ex2.xlsx文件:

! rm examples/ex2.xlsx

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值