最简单的以二进制的格式来存储数据的方法(也被叫做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。
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)。它最适合一次写入,多次读取的数据库。尽管数据可以在任何时间多次写入一个文件,如果多个使用者同时写入的话,文件会被破坏。
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