1 简介

HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式。

其文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一个HDF5可以看做一个高度整合的文件夹,其内部可存放不同类型的数据。

Python中操纵HDF5文件的方式主要有两种,一是利用pandas中内建的一系列HDF5文件操作相关的方法来将pandas中的数据结构保存在HDF5文件中,二是利用h5py模块来完成从Python原生数据结构向HDF5格式的保存。

本文就将针对pandas中读写HDF5文件的方法进行介绍。

图1

2 利用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:

import pandas as pdstore = pd.HDFStore('demo.h5')
'''查看store类型'''
print(store)

图2

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

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

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

图3

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

#创建一个dataframe对象
df = pd.DataFrame(np.random.randn(8, 3),columns=['A', 'B', 'C'])
df

图4

第一种方式利用键值对将不同的数据存入store对象中:

store['s'], store['df'] = s, df

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

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

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

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

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

store.put(key='s', value=s);store.put(key='df', value=df)

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

store.items

图5

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

store['df']

图6

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

store.remove('s')

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

del store['s']

这时若想将当前的store对象持久化到本地,只需要利用close()方法关闭store对象即可,而除了通过定义一个确切的store对象的方式之外,还可以从pandas中的数据结构直接导出到本地h5文件中:

#创建新的数据框
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())

图7

2.2 读入文件

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

store = pd.HDFStore('demo.h5')
'''方式1'''
df1 = store['df']
'''方式2'''
df2 = store.get('df')
df1 == df2

图8

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

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

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

「key」:要提取数据的键

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

print(store.is_open)
df = pd.read_hdf('demo.h5',key='df')

图9

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

store.close()
print(store.is_open)
df = pd.read_hdf('demo.h5',key='df')
df

图10

2.3 性能测试

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

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

import pandas as pd
import numpy as np
import timestore = 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}秒')

图11

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

图12

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

import pandas as pd
import timestart1 = 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}秒')

图13

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


以上就是本文的全部内容,欢迎在评论区与我进行讨论~

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/662nyZF本站qq群704220115。加入微信群请扫码进群(如果是博士或者准备读博士请说明):

【Python基础】在pandas中利用hdf5高效存储数据相关推荐

  1. Python应用实战-在pandas中利用hdf5高效存储数据

    1 简介 HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式. 其文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一 ...

  2. 【Python基础】pandas中apply与map的异同

    ◆ ◆ ◆  ◆ ◆ 前言 pandas作为数据处理与分析的利器,它的江湖地位非同小可.在我们数据处理与分析过程中,有时候需要对某一列的每一个值都进行处理,这时候推荐大家使用apply或者map. 但 ...

  3. python中的iloc函数_详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

    pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称.这样内部数据抽取既可以用"行列名称(对应.loc[]方法)",也 ...

  4. 如何利用python将excel表格中筛选出来的每一份数据各自另存为新的excel文件?

    如何利用python将excel表格中筛选出来的每一份数据各自另存为新的excel文件? 1.问题描述 2.解决过程 2.1 问题分析: 2.2 解决思路 3.运行结果 1.问题描述 最近在处理一堆工 ...

  5. Python数据处理库pandas中的DataFrame数据结构简介

    pandas 中有两大 数据结构 Series和 DataFrame. 本文主要介绍DataFrame的用法.DataFrame可以处理 表格数据. Series介绍在 Python数据处理库pand ...

  6. python read_excel 参数_对Python 2.7 pandas 中的read_excel详解

    对Python 2.7 pandas 中的read_excel详解 发布时间:2020-08-28 03:32:56 来源:脚本之家 阅读:106 作者:G_66_hero 导入pandas模块: i ...

  7. 在python中使用json格式存储数据

    在python中使用json格式存储数据 代码如下: import jsonlist1 = [{'A': [1, 2, 3, 4, 5, 6], 'B': [3, 4, 5, 6, 7]},{'C': ...

  8. MVC中利用ViewBag传递Json数据时的前端处理方法

    ** MVC中利用ViewBag传递Json数据时的前端处理方法 ** 用viewBag传递Json字符串到前端时,json字符串中的"会被转义为& quot,前端处理方法为@Htm ...

  9. python量化交易pandas中的用途

    Pandas 是一个重要的数据处理和分析库,它提供了许多功能强大的数据结构和函数,可以帮助我们在期货量化交易中进行数据清洗 目录: 1.读取和写入数据 2.数据清洗和预处理-1 3.数据分组和聚合 4 ...

最新文章

  1. Java程序猿面试题集(181- 199)
  2. 纪委计算机管理制度,纪委监察处信息管理办法
  3. 09-spring学习-资源访问接口
  4. jq之mouseleave()
  5. (ssh整合web导出excel)在ssh框架中使用poi正确导出具有比较高级固定格式的excel 整体过程,查询导出前后台下载...
  6. 使用IDEA在Maven中创建MyBatis逆向工程以及需要注意的问题(入门)
  7. 剑指offer——面试题64:数据流中的中位数
  8. linux+npm+v+报错_linux下安装npm
  9. RedHat下通过Rdesktop连接window远程桌面
  10. java 实体类重写排序,对自定义对象进行排序(C++/Java) | 学步园
  11. php系统变量有哪些,php预定义系统变量
  12. 【爬虫】微博数据采集
  13. 计算机网络为什么要分层?
  14. 手机如何打开html文件怎么打开,怎么在手机上打开HTML文件怎么打开
  15. 【win11远程桌面访问--基于云端服务器(腾讯云为例)frp的内网穿透实现】
  16. 49个终身受用的世界顶级思维(收藏)
  17. jTessBoxEditor2.3.1训练字库
  18. maven 打包将依赖打进jar包
  19. 基于Matlab闭环Buck降压斩波电路Simulink仿真电路模型搭建
  20. Unity2019 UIElement 笔记(十四)UI Builder

热门文章

  1. javascript对数值增加千分点/删除千分点
  2. 《微软文档管理解决方案2007》之一:安装部署 - [SharePoint Server]
  3. 医保费用监控指标体系建立(四)医疗机构指标分析
  4. 《剑指offer》第四题(二维数组中的查找)
  5. 部署Office Web Apps Server并配置其与SharePoint 2013的集成
  6. PG SQL数据库读写分离的思路
  7. WCF绑定细节(2)——绑定,绑定元素
  8. #转载:杨辉三角形实现过程详解-c语言基础
  9. java pdf 书签_Java PDF书签——添加、编辑、删除、读取书签
  10. simulink自定义信号源方法matlab数据导入sim