pandas教程:Binary Data Formats 二进制数据格式-灵析社区

清晨我上码

6.2 Binary Data Formats (二进制数据格式)

最简单的以二进制的格式来存储数据的方法(也被叫做serialization,序列化),就是用python内建的pickle。所有的pandas object都有一个to_pickle方法,可以用来存储数据为pickle格式:

import pandas as pd
import numpy as np
frame = pd.read_csv('../examples/ex1.csv')
frame

frame.to_pickle('../examples/frame_pickle')
!ls ../examples/


array_archive.npz          [31mmacrodata.csv[m[m
array_compressed.npz       mydata.csv
[31marray_ex.txt[m[m               [31mout.csv[m[m
[31mcsv_mindex.csv[m[m             [31msegismundo.txt[m[m
[31mex1.csv[m[m                    sink.txt
[31mex1.xlsx[m[m                   some_array.npy
[31mex2.csv[m[m                    [31mspx.csv[m[m
[31mex3.csv[m[m                    [31mstinkbug.png[m[m
[31mex3.txt[m[m                    [31mstock_px.csv[m[m
[31mex4.csv[m[m                    [31mstock_px_2.csv[m[m
[31mex5.csv[m[m                    [31mtest_file.csv[m[m
[31mex6.csv[m[m                    [31mtips.csv[m[m
[31mex7.csv[m[m                    tmp.txt
[31mexample.json[m[m               [31mtseries.csv[m[m
[31mfdic_failed_bank_list.html[m[m [31mvolume.csv[m[m
frame_pickle               [31myahoo_price.pkl[m[m
[31mipython_bug.py[m[m             [31myahoo_volume.pkl[m[m

用内建的pickle可以直接读取任何pickle文件,或者直接用pandas.read_pickle:

pd.read_pickle('../examples/frame_pickle')

注意:pickle只推荐用于短期存储。因为这种格式无法保证长期稳定;比如今天pickled的一个文件,可能在库文件更新后无法读取。

python还支持另外两种二进制数据格式:HDF5和MessagePack。下面会介绍一个HDF5,但是我们鼓励你多尝试一个不同的文件格式,看看他们能有多快,是否符合你数据分析的要求。另外一些可用的存储格式有:bcolz 和 Feather。

1 Using HDF5 Format

HDF5格式是用来存储大量的科学数组数据的。这种格式还能用于其他一些语言。其中HDF表示hierarchical data format。每一个HDF5格式能春初多个数据集,并支持metadata。

元数据(meta data)——“data about data” 关于数据的数据,一般是结构化数据(如存储在数据库里的数据,规定了字段的长度、类型等)。元数据是指从信息资源中抽取出来的用于说明其特征、内容的结构化的数据(如题名,版本、出版数据、相关说明,包括检索点等),用于组织、描述、检索、保存、管理信息和知识资源。

HDF5 支持多种压缩模式的on-the-fly compression(即时压缩),能让数据中一些重复的部分存储地更有效。HDF5对于处理大数据集是一个很好的选择,因为他不会把所有数据一次性读取到内存里,我们可以从很大的数组中有效率地读取一小部分。

能用PyTables或h5py来访问HDF5数据,pandas也有提供一个high-level的交互界面。HDFStore类像dict一样能用来处理low-level细节:

frame = pd.DataFrame({'a': np.random.randn(100)})

store = pd.HDFStore('../examples/mydata.h5')
frame.head()

cat ../examples/mydata.csv
one;two;three
1;2;3
4;5;6
7;8;9
store['obj1'] = frame

store['obj1_col'] = frame['a']

store
<class 'pandas.io.pytables.HDFStore'>
File path: ../examples/mydata.h5
/obj1                frame        (shape->[100,1])
/obj1_col            series       (shape->[100])  

HDF5中的object能用像dict一样的API来提取:

store['obj1']

100 rows × 1 columns

HDFStore支持两种存储架构,fixed和table。后者通常更慢一些,但支持查询操作:

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

put是存储的另一种写法,类似于之前的store['obj2'] = frame,但这种协防能让我们设置存储格式。

pandas.read_hdf函数也很方便:

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

注意:如果我们是把数据存在远端服务器上,比如Amazon S3或HDFS,使用一些为分布式存储实际的二进制格式会更适合一些,比如Apache Parquet。

如果是在本地处理很大数据量的话,推荐尝试PyTables和h5py看是否符合你的要求。因为很多数据分析问题都受限于I/O,所以用HDF5这样的工具能加快应用。

注意:HDF5不是数据库(database)。它最适合一次写入,多次读取的数据库。尽管数据可以在任何时间多次写入一个文件,如果多个使用者同时写入的话,文件会被破坏。

2 Reading Microsoft Excel Files(读取微软的excel文件)

pandas支持读取表格型数据(excel 2003或更高)文件,使用ExcelFile class或pandas.read_excel函数。这些工具需要一些富家的包xlrd和openpyxl来分别读取XLS和XLSX文件。你可以通过pip或conda来安装。

使用ExcelFile,创建一个instance,通过给xls或xlsx一个路径:

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

保存在sheet里的数据,可以通过parse来读取为DataFrame:

pd.read_excel(xlsx, 'Sheet1')

如果要读取一个文件中的多个sheet,用ExcelFile会更快。但让你也能把文件名直接传递给pandas.read_excel:

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

如果要把pandas数据写为Excel格式,你必须先创建一个ExcelWrite,然后用to_excel方法:

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

如果不适用ExcelWriter的话,可以直接传给to_excel一个path:

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


阅读量:1288

点赞量:0

收藏量:0