pandas HDF5与EXCEL文件
一、HDF5
HDF5是一个备受好评的文件格式,广泛用于存储大量的科学计算数组。很多数据分析的实际工作中困难都在于I/O密集,而不是CPU密集,使用HDF5这样的工具可以大大加速你的应用。它以C库的形式提供,并且具有许多其它语言的接口,包括Java、MATLAB和Python。HDF5中的HDF代表分层数据格式。每个HDF5文件可以存储多个数据集并且支持元数据。支持多种压缩模式的即时压缩,使得重复模式的数据可以更高效地存储。HDF5适用于处理不适合在内存中存储地超大型数据,可以使你高效读写大型数据的一小块。
要注意的是HDF5并不是数据库,它是一种适合一次写入多次读取的数据集。尽管数据可以在任何时间添加到文件中,但如果多个写入者持续写入,文件可能会损坏。
在外部,可以通过使用PyTables或h5py等库直接访问HDF5文件,但Pandas提供了一个高阶的接口,可以简化存储过程。
Pandas使用HDFStore类来实现这一功能,类似字典一样的工作方式:
In [90]: df = pd.DataFrame({'a':np.random.randn(100)}) # 有100行
In [91]: df.head() # 看看前5行
Out[91]:
a
0 -0.917062
1 0.797327
2 0.659787
3 -0.779638
4 0.550464
In [92]: store = pd.HDFStore('mydata.h5') # 生成HDF5文件
In [93]: store['obj1'] = df # 以类似字典的方式,向文件里写入内容
In [94]: store['obj1_col'] = df['a'] # 再写一点
In [95]: store # 看看信息,在当前工作目录下,你可以找到这个文件
Out[95]:
<class 'pandas.io.pytables.HDFStore'>
File path: mydata.h5
既然是类似字典的工作方式,那当然也可以像字典那样索引数据:
In [97]: store['obj1']
Out[97]:
a
0 -0.917062
1 0.797327
2 0.659787
3 -0.779638
4 0.550464
.. ...
95 -2.042226
96 1.286631
97 0.487709
98 -0.202580
99 1.619085
[100 rows x 1 columns]
HDFStore支持两种工作模式,‘fixed’和‘table’。table的速度更慢,但支持一种类似数据库SQL语言的查询操作:
In [98]: store.put('obj2',df,format='table') # put是赋值的显式版本,允许我们设置其它选项
In [99]: store.select('obj2', where=['index >=10 and index <= 15']) # 类似SQl语言的查询操作,要注意空格的位置
Out[99]:
a
10 -1.430696
11 -0.616732
12 -0.643991
13 -0.004270
14 0.797136
15 -0.175095
In [100]: store.close() # 关闭文件
除此之外,Padas还提供了以上操作的快捷方式:
In [101]: df.to_hdf('mydata.h5','obj3', format='table')
In [102]: pd.read_hdf('mydata.h5', 'obj3' ,where=['index < 5'])
Out[102]:
a
0 -0.917062
1 0.797327
2 0.659787
3 -0.779638
4 0.550464
二、Excel文件
Pandas支持Excle 2003或更高版本文件的读写。在内部,这需要使用附加包xlrd和openpyxl来分别读取XLS和XLSX文件。如果你的环境中没有这两个包,可能需要使用pip或者conda手动安装一下。
使用很简单,看下面的例子:
In [104]: xlsx = pd.ExcelFile('d:/ex1.xlsx') # 打开excel文件
In [105]: pd.read_excel(xlsx, 'Sheet1') # 读取指定的表
Out[105]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
或者使用更简洁的语法:
In [106]: df = pd.read_excel('d:/ex1.xlsx', 'Sheet1')
In [107]: df
Out[107]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
将pandas数据写回到excel文件中时,你必须先生成一个ExcelWriter,然后使用to_excel方法将数据写入:
In [108]: writer = pd.ExcelWriter('d:/ex2.xlsx') # 生成文件
In [109]: df.to_excel(writer, 'Sheet1') # 写入
In [110]: writer.save() #关闭文件
当然,也可以使用快捷操作:
In [112]: df.to_excel('d:/ex3.xlsx')