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')
posted @ 2020-04-16 09:21  如心幻雨  阅读(1319)  评论(0编辑  收藏  举报