Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >(数据科学学习手札63)利用pandas读写HDF5文件

(数据科学学习手札63)利用pandas读写HDF5文件

作者头像
Feffery
发布于 2019-07-08 08:20:53
发布于 2019-07-08 08:20:53
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

一、简介

  HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式,文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一个HDF5可以看做一个高度整合的文件夹,其内部可存放不同类型的数据。在Python中操纵HDF5文件的方式主要有两种,一是利用pandas中内建的一系列HDF5文件操作相关的方法来将pandas中的数据结构保存在HDF5文件中,二是利用h5py模块来完成从Python原生数据结构向HDF5格式的保存,本文就将针对pandas中读写HDF5文件的方法进行介绍。

二、利用pandas操纵HDF5文件

2.1 写出

  pandas中的HDFStore()用于生成管理HDF5文件IO操作的对象,其主要参数如下:

  path:字符型输入,用于指定h5文件的名称(不在当前工作目录时需要带上完整路径信息)

  mode:用于指定IO操作的模式,与Python内建的open()中的参数一致,默认为'a',即当指定文件已存在时不影响原有数据写入,指定文件不存在时则新建文件;'r',只读模式;'w',创建新文件(会覆盖同名旧文件);'r+',与'a'作用相似,但要求文件必须已经存在;

  complevel:int型,用于控制h5文件的压缩水平,取值范围在0-9之间,越大则文件的压缩程度越大,占用的空间越小,但相对应的在读取文件时需要付出更多解压缩的时间成本,默认为0,代表不压缩

  下面我们创建一个HDF5 IO对象store:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd

store = pd.HDFStore('demo.h5')
'''查看store类型'''
print(store)

  可以看到store对象属于pandas的io类,通过上面的语句我们已经成功的初始化名为demo.h5的的文件,本地也相应的出现了如下的文件:

  接下来我们创建pandas中不同的两种对象,并将它们共同保存到store中,首先创建series对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np

#创建一个series对象
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s

  接着我们创建一个dataframe对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#创建一个dataframe对象
df = pd.DataFrame(np.random.randn(8, 3),
                 columns=['A', 'B', 'C'])
df

  第一种方式利用键值对将不同的数据存入store对象中,这里为了代码简洁使用了元组赋值法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store['s'],store['df'] = s,df

  第二种方式利用store对象的put()方法,其主要参数如下:

  key:指定h5文件中待写入数据的key

  value:指定与key对应的待写入的数据

  format:字符型输入,用于指定写出的模式,'fixed'对应的模式速度快,但是不支持追加也不支持检索;'table'对应的模式以表格的模式写出,速度稍慢,但是支持直接通过store对象进行追加和表格查询操作

  使用put()方法将数据存入store对象中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store.put(key='s',value=s);store.put(key='df',value=df)

  既然是键值对的格式,那么可以查看store的items属性(注意这里store对象只有items和keys属性,没有values属性):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store.items

  调用store对象中的数据直接用对应的键名来索引即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store['df']

  删除store对象中指定数据的方法有两种,一是使用remove()方法,传入要删除数据对应的键:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store.remove('s')
print(store.keys())

  二是使用Python中的关键词del来删除指定数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
del store['s']
print(store.keys())

  打印出的结果都如下:

  这时若想将当前的store对象持久化到本地,只需要利用close()方法关闭store对象即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store.close()
'''查看store连接状况,False则代表已关闭'''
store.is_open

  这时本地的h5文件也相应的存储进store对象关闭前包含的文件:

  除了通过定义一个确切的store对象的方式,还可以从pandas中的数据结构直接导出到本地h5文件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#创建新的数据框
df_ = pd.DataFrame(np.random.randn(5,5))
#导出到已存在的h5文件中,这里需要指定key
df_.to_hdf(path_or_buf='demo.h5',key='df_')
#创建于本地demo.h5进行IO连接的store对象
store = pd.HDFStore('demo.h5')
#查看指定h5对象中的所有键
print(store.keys())

2.2 读入

  在pandas中读入HDF5文件的方式主要有两种,一是通过上一节中类似的方式创建与本地h5文件连接的IO对象,接着使用键索引或者store对象的get()方法传入要提取数据的key来读入指定数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store = pd.HDFStore('demo.h5')
'''方式1'''
df1 = store['df']
'''方式2'''
df2 = store.get('df')
df1 == df2

  可以看出这两种方式都能顺利读取键对应的数据。

  第二种读入h5格式文件中数据的方法是pandas中的read_hdf(),其主要参数如下:

  path_or_buf:传入指定h5文件的名称

  key:要提取数据的键

  需要注意的是利用read_hdf()读取h5文件时对应文件不可以同时存在其他未关闭的IO对象,否则会报错,如下例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(store.is_open)
df = pd.read_hdf('demo.h5',key='df')

  把IO对象关闭后再次提取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store.close()
print(store.is_open)
df = pd.read_hdf('demo.h5',key='df')
df

2.3 速度比较

  这一小节我们来测试一下对于存储同样数据的csv格式文件、h5格式的文件,在读取速度上的差异情况:

  这里我们首先创建一个非常大的数据框,由一亿行x5列浮点类型的标准正态分布随机数组成,接着分别用pandas中写出HDF5和csv格式文件的方式持久化存储:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np
import time

store = pd.HDFStore('store.h5')
#生成一个1亿行,5列的标准正态分布随机数表
df = pd.DataFrame(np.random.rand(100000000,5))
start1 = time.clock()
store['df'] = df
store.close()
print(f'HDF5存储用时{time.clock()-start1}秒')
start2 = time.clock()
df.to_csv('df.csv',index=False)
print(f'csv存储用时{time.clock()-start2}秒')

  在写出同样大小的数据框上,HDF5比常规的csv快了将近50倍,而且两者存储后的文件大小也存在很大差异:

  csv比HDF5多占用将近一倍的空间,这还是在我们没有开启HDF5压缩的情况下,接下来我们关闭所有IO连接,运行下面的代码来比较对上述两个文件中数据还原到数据框上两者用时差异:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import time

start1 = time.clock()
store = pd.HDFStore('store.h5',mode='r')
df1 = store.get('df')
print(f'HDF5读取用时{time.clock()-start1}秒')
start2 = time.clock()
df2 = pd.read_csv('df.csv')
print(f'csv读取用时{time.clock()-start2}秒')

  HDF5用时仅为csv的1/13,因此在涉及到数据存储特别是规模较大的数据时,HDF5是你不错的选择。

  以上就是本文的全部内容,如有笔误望指出!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python3快速入门(十四)——Pan
pandas.read_csv(filepath_or_buffer, na_values='NAN', parse_dates=['Last Update']) 从CSV文件中读取数据并创建一个DataFrame对象,na_vlaues用于设置缺失值形式,parse_dates用于将指定的列解析成时间日期格式。 dataframe.to_csv("xxx.csv", mode='a', header=False) 导出DataFrame数据到CSV文件。
py3study
2020/01/03
3.9K0
Pandas使用 (一)
What is pandas Pandas是python中用于处理矩阵样数据的功能强大的包,提供了R中的dataframe和vector的操作,使得我们在使用python时,也可以方便、简单、快捷、高效地进行矩阵数据处理。 具体介绍详见http://pandas.pydata.org/。 A fast and efficient DataFrame object for data manipulation with integrated indexing; Tools for reading and wri
生信宝典
2018/02/05
2.5K0
还在抱怨pandas运行速度慢?这几个方法会颠覆你的看法
当大家谈到数据分析时,提及最多的语言就是Python和SQL。Python之所以适合数据分析,是因为它有很多第三方强大的库来协助,pandas就是其中之一。pandas的文档中是这样描述的:
Python数据科学
2018/12/26
3.5K0
《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式6.1 读写文本格式的数据6.2 二进制数据格式6.3 Web APIs交互6.4 数据库交互6.5 总结
访问数据是使用本书所介绍的这些工具的第一步。我会着重介绍pandas的数据输入与输出,虽然别的库中也有不少以此为目的的工具。 输入输出通常可以划分为几个大类:读取文本文件和其他更高效的磁盘存储格式,加
SeanCheney
2018/04/24
7.4K0
《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式6.1 读写文本格式的数据6.2 二进制数据格式6.3 Web APIs交互6.4 数据库交互6.5 总结
利用Python Numpy高效管理HDF5文件数据
在大数据处理和科学计算中,HDF5(Hierarchical Data Format version 5)文件格式因其高效的数据存储和处理能力被广泛应用。HDF5支持层次化结构,能够在单个文件中存储和管理大规模的多维数据集。Python中的Numpy库虽然以数值计算著称,但借助于外部库如h5py,可以轻松实现HDF5文件的读写操作。本文将详细介绍如何使用Numpy结合h5py库读写HDF5文件,适合需要处理大规模数据集的用户。
sergiojune
2024/09/24
3070
利用Python Numpy高效管理HDF5文件数据
产生和加载数据集
read 函数不带参数使用时会一次读入文件的全部内容,因为会占用系统的内存,可以选择分块读入再进行拼接:
爱编程的小明
2022/09/05
2.6K0
产生和加载数据集
【说站】python如何查看hdf5文件
以上就是python查看hdf5文件的方法,希望对大家有所帮助。更多Python学习指路:python基础教程
很酷的站长
2022/11/23
1.8K0
【说站】python如何查看hdf5文件
解决ImportError: HDFStore requires PyTables, "No module named 'tables'" problem im
如果在Python中使用​​pandas​​库时遇到了以下错误信息:​​ImportError: HDFStore requires PyTables, "No module named 'tables'"​​,那么说明你的环境缺少​​PyTables​​库。 ​​PyTables​​是一个用于在Python中操作HDF5文件的库,而​​pandas​​使用了​​PyTables​​来支持HDF5数据的存储和读取。因此,在使用​​pandas​​来读取或存储HDF5文件时,需要先安装​​PyTables​​库。 下面是解决这个问题的步骤:
大盘鸡拌面
2023/10/25
5880
python打开h5文件可视化_python环境变量的配置
该文件可以在this link中找到,名为“vstoxx_data_31032014.h5”。我试图运行的代码来自Yves Hilpisch的《Python for Finance》一书,内容如下:import pandas as pd
全栈程序员站长
2022/10/01
1.4K0
Caffe - 创建LMDB/HDF5格式数据
LMDB格式的优点: - 基于文件映射IO(memory-mapped),数据速率更好 - 对大规模数据集更有效.
AIHGF
2019/02/18
1.6K0
Pandas 高级教程——IO 操作
Pandas 提供了强大的 IO 操作功能,可以方便地读取和写入各种数据源,包括文本文件、数据库、Excel 表格等。本篇博客将深入介绍 Pandas 中的高级 IO 操作,通过实例演示如何灵活应用这些功能。
Echo_Wish
2023/12/27
3050
.h5文件的读取_python读写h5文件
HDF(Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件。详见其官方介绍:https://support.hdfgroup.org/HDF5/ 。
全栈程序员站长
2022/09/30
2.8K0
.h5文件的读取_python读写h5文件
Python八种数据导入方法,你掌握了吗?
数据分析过程中,需要对获取到的数据进行分析,往往第一步就是导入数据。导入数据有很多方式,不同的数据文件需要用到不同的导入方式,相同的文件也会有几种不同的导入方式。下面总结几种常用的文件导入方法。
数据STUDIO
2021/06/24
3.5K0
Pandas 2.2 中文官方教程和指南(二十五·二)
将一个以小时为列、天为行的矩阵转换为连续的行序列,形成时间序列。如何重新排列 Python pandas DataFrame?
ApacheCN_飞龙
2024/05/24
1910
Pandas 2.2 中文官方教程和指南(二十五·二)
HDF4与HDF5文件的打开方式:HDFView软件
  本文介绍在Windows电脑中,下载、安装用以查看HDF5图像数据的软件HDFView的方法。
疯狂学习GIS
2024/10/10
7940
HDF4与HDF5文件的打开方式:HDFView软件
在VMD上可视化hdf5格式的分子轨迹文件
在处理分子动力学模拟的数据时,不可避免的会遇到众多的大轨迹文件。因此以什么样的格式来存储这些庞大的轨迹数据,也是一个在分子动力学模拟软件设计初期就应该妥善考虑的问题。现有的比较常见的方式,大致可以分为存成明文的和存成二进制的两种方式。这两种方式各有优劣,明文存储可读性较好,二进制文件压缩率较好,不会占用太大的空间。又因为我们也不会经常性的去打开轨迹文件一个一个的检索,因此二进制文件是一个更好的存储格式选项。如果不仅仅限于分子动力学模拟的领域,在其他数据领域经常用的格式有npz等。而经过各种格式的对比之后,发现hdf5格式是一种非常适合用来存储分子动力学轨迹的文件,其原因主要有:
DechinPhy
2022/09/19
6890
系统性的学会 Pandas, 看这一篇就够了!
Numpy已经能够帮助我们处理数据,能够结合matplotlib解决部分数据展示等问题,那么pandas学习的目的在什么地方呢?
1480
2021/08/26
4.4K0
python | 读文件 | csv 、json、pickle、sql等
来说下pandas用于读取的文件格式有那些吧,这些读取方法获取文件的速度超级快,很实用。
努力在北京混出人样
2019/02/18
1.4K0
python读取与写入csv EXCEK HDF 文件
一. 数据文件         pd指pandas简称,df指DataFrame对象。 1. csv 读取  pd.read_csv('foo.csv') 写入  df.to_csv('foo.csv') 2. HDF5 读取  pd.read_hdf('foo.h5', 'df') 写入  df.to_hdf('foo.h5', 'df') 3. Excel 读取  pd.read_excel('foo.xlsx', 'sheet1', index_col=None, na_values=['NA'])
学到老
2018/03/16
2.2K0
Pandas内存优化和数据加速读取
一个现象是,在使用pandas进行数据处理的时候,加载大的数据或占用很大的内存和时间,甚至有时候发现文件在本地明明不大,但是用pandas以DataFrame形式加载内存中的时候会占用非常高的内存。
double
2019/12/23
2.7K0
Pandas内存优化和数据加速读取
推荐阅读
相关推荐
Python3快速入门(十四)——Pan
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文