当前位置: 首页 > news >正文

Python数据分析NumPy和pandas(十七、pandas 二进制格式文件处理)

以二进制格式存储(或序列化)数据的一种简单方法是使用 Python 的内置 pickle 模块。同时,pandas 构造的对象都有一个 to_pickle 方法,该方法以 pickle 格式将数据写入磁盘。

我们先把之前示例用到的ex1.csv文件加载到pandas对象中,然后将数据以二进制pickle格式写入examples/frame_pickle文件中:

import pandas as pdframe = pd.read_csv("examples/ex1.csv")
frame.to_pickle("examples/frame_pickle")

以上代码会将数据输出到一个frame_pickle文件中:

Pickle 文件通常仅在 Python 中可读。可以直接使用内置的 pickle 来读取存储在文件中的任何 “pickled” 对象,或者用更简单方便的方式来读取,就是 pandas.read_pickle,我们把上面生成的frame_pickle文件加载回来:pd.read_pickle("examples/frame_pickle")  可以打印出来会输出以下内容:

abcdmessage
01234hello
15678world
29101112foo

注意:Pickle 仅推荐作为短期存储格式。问题在于很难保证格式会随着时间的推移而稳定;例如,今天被 picked 的对象可能无法使用更高版本的 library来unpickle 。pandas 会尽可能保持向后兼容性,但在将来,可能需要 “打破” 当前的pickle 格式。

pandas 也内置了对其他几种开源二进制数据格式的支持,例如 HDF5、ORC 和 Apache Parquet。例如,如果安装了 pyarrow  (pip install pyarrow或conda install pyarrow),则可以使用 pandas.read_parquet 读取 Parquet 文件。

fec = pd.read_parquet('datasets/fec/fec.parquet')

fec.head()

输出前5行:

cmte_idcand_idcand_nmcontbr_nmcontbr_citycontbr_stcontbr_zipcontbr_employercontbr_occupationcontb_receipt_amtcontb_receipt_dtreceipt_descmemo_cdmemo_textform_tpfile_num
0C00410118P20002978Bachmann, MichelleHARVEY, WILLIAMMOBILEAL366010290RETIREDRETIRED250.020-JUN-11NoneNoneNoneSA17A736166
1C00410118P20002978Bachmann, MichelleHARVEY, WILLIAMMOBILEAL366010290RETIREDRETIRED50.023-JUN-11NoneNoneNoneSA17A736166
2C00410118P20002978Bachmann, MichelleSMITH, LANIERLANETTAL368633403INFORMATION REQUESTEDINFORMATION REQUESTED250.005-JUL-11NoneNoneNoneSA17A749073
3C00410118P20002978Bachmann, MichelleBLEVINS, DARONDAPIGGOTTAR724548253NONERETIRED250.001-AUG-11NoneNoneNoneSA17A749073
4C00410118P20002978Bachmann, MichelleWARDENBURG, HAROLDHOT SPRINGS NATIONAR719016467NONERETIRED300.020-JUN-11NoneNoneNoneSA17A736166

对于HDF5格式文件的存取,我也将在后面进行学习。鼓励感兴趣的同学自己探索不同的文件格式,以了解它们的速度以及它们对在数据分析中的效果。

一、读取 Microsoft Excel 文件 

pandas 支持使用ExcelFile 类或 pandas.read_excel 函数等读取存储在 Excel 2003(及更高版本)文件中的表格数据。但是在内部,这些工具要使用附加组件包 xlrd 和 openpyxl 分别读取旧式 XLS 和较新的 XLSX 文件。我们可以使用 pip 或 conda分开安装。

pip install openpyxl xlrd

如果使用的是conda开发工具则可以使用

conda install openpyxl xlrd

使用 pandas的ExcelFile,我们通过传递 xls 或 xlsx 文件的路径来创建实例(这里使用的ex1.xlsx是一个二进制文件无法直接打开),例如:

xlsx = pd.ExcelFile("examples/ex1.xlsx")

此xlsx对象可以显示文件中可用工作表名称的列表: xlsx.sheet_names

然后可以通过 parse 将存储在工作表中的数据读入 DataFrame,加载为DataFrame后,就可以方便的进行数据处理分析等。

xlsx.parse(sheet_name="Sheet1")

输出:

Unnamed: 0abcdmessage
001234hello
115678world
229101112foo

 从上面输出可以了解到这个 Excel 表格有一个索引列,所以我们可以使用 index_col 参数来指示,重新编码:

xlsx.parse(sheet_name="Sheet1", index_col=0)

输出: 

abcdmessage
01234hello
15678world
29101112foo

使用pandas.ExcelFile读取excel文件中的多个工作表会更快,但我们也可以使用pandas.read_excel,这个编写代码相对更简单,同样接收文件名作为参数。例如:

frame = pd.read_excel("examples/ex1.xlsx", sheet_name="Sheet1") 

 输出:

Unnamed: 0abcdmessage
001234hello
115678world
229101112foo

要将 pandas 数据写入 Excel 格式,要先创建一个 ExcelWriter,然后使用 pandas 对象的 to_excel 方法将数据写入其中:

writer = pd.ExcelWriter("examples/ex2.xlsx")

frame.to_excel(writer, "Sheet1")

writer.save()

还可以将文件路径传递给 to_excel 而避免使用 ExcelWriter:

frame.to_excel("examples/ex2.xlsx") 

二、使用 HDF5 格式

HDF5 是一种备受推崇的文件格式,用于存储大量科学阵列数据。它以 C 库的形式提供,并且具有许多其他编程语言的接口,包括 Java、Julia、MATLAB 和 Python。HDF5 中的“HDF”代表分层数据格式。每个 HDF5 文件都可以存储多个数据集和支持元数据。与其他更简单的格式相比,HDF5 支持具有多种压缩模式的动态压缩,从而能够更高效地存储具有重复模式的数据。HDF5 是处理不适合内存的数据集的不错选择,因为我们可以方便有效地读取和写入大数组中的小部分。

要开始使用 HDF5 和 pandas,必须首先通过使用 pip 或 conda 安装 PyTables: 

pip install tables或 conda install pytables

注意:PyTables 包在 PyPI 中称为 “tables”,因此如果使用 pip 安装,则必须运行 pip install tables

虽然可以使用 PyTables 或 h5py 库直接访问 HDF5 文件,但 pandas 提供了一个高级接口,可简化 Series 和 DataFrame 对象的存储。HDFStore 类的工作方式类似于字典。例如:

import numpy as np
import pandas as pdframe = pd.DataFrame({"a": np.random.standard_normal(100)})
store = pd.HDFStore("examples/mydata.h5")
store["obj1"] = frame
store["obj1_col"] = frame["a"]
print(store)
store.close()

以上代码会在examples目录中生成一个mydata.h5二进制文件,该文件类似于字典存储了frame中的数据。同时控制台打印出了store对象的类型和该文件存储的位置:

<class 'pandas.io.pytables.HDFStore'>
File path: examples/mydata.h5   

 可以使用相同的类似字典的方式检索 HDF5 文件中包含的对象:

import numpy as np
import pandas as pdframe = pd.DataFrame({"a": np.random.standard_normal(100)})
store = pd.HDFStore("examples/mydata.h5")
store["obj1"] = frame
store["obj1_col"] = frame["a"]
#检索对象
obj1 = store["obj1"]
print(obj1)store.close()

 输出:

                  a
0  -0.116291
1  -1.111014
2  -1.202469
3   0.436760
4  -0.989590
..       ...
95 -1.201137
96  1.113517
97 -0.942226
98 -0.485934
99  0.590444

[100 rows x 1 columns]

HDFStore 支持两种存储架构,即 “fixed” 和 “table” (默认为 “fixed”)。后者通常较慢,但它支持使用特殊语法的查询操作,例如:

import numpy as np
import pandas as pdframe = pd.DataFrame({"a": np.random.standard_normal(100)})
store = pd.HDFStore("examples/mydata.h5")
#默认fixed存储
store["obj1"] = frame
store["obj1_col"] = frame["a"]#设置table存储
store.put("obj2", frame, format="table")
#根据条件查询需要的数据
a = store.select("obj2", where=["index >= 10 and index <= 15"])
print(a)
store.close()

输出:

                   a
10  0.211580
11  0.196123
12 -0.869757
13 -1.543114
14 -0.566423
15  0.078732

还有更方便的方法:DataFrame.to_hdf 和 pandas.read_hdf ,上代码学习:

import numpy as np
import pandas as pdframe = pd.DataFrame({"a": np.random.standard_normal(100)})#将frame中的数据以table存储方式写入mydata.h5
frame.to_hdf("examples/mydata.h5", "obj3", format="table")
#读取前5行。
a = pd.read_hdf("examples/mydata.h5", "obj3", where=["index < 5"])print(a)

输出:

                 a
0 -0.321670
1  0.011807
2  1.048680
3 -1.443384
4  0.312067

 如果需要,可以删除创建的 HDF5 文件,如下所示:

import osos.remove("examples/mydata.h5")

注意:如果需要处理存储在远程服务器(如 Amazon S3 或 HDFS)上的数据,则使用专为分布式存储设计的二进制格式(如 Apache Parquet)可能更合适。

如果是在本地处理大量数据,可以更多的使用 PyTables 和 h5py,但是基于以上的学习内容还不够,需要深入了解他们的功能。由于许多数据分析问题都是 I/O 密集型(而不是 CPU 密集型)的,因此 HDF5 这样的工具使用会极大的提高我们的访问效率。

另外一个要注意的是:HDF5 不是数据库。它非常适合一次写入、多次读取的数据集。虽然我们可以随时将数据添加到HDF5 文件中,但如果多个写入器同时写入,则有可能会造成文件损坏。

相关文章:

Python数据分析NumPy和pandas(十七、pandas 二进制格式文件处理)

以二进制格式存储&#xff08;或序列化&#xff09;数据的一种简单方法是使用 Python 的内置 pickle 模块。同时&#xff0c;pandas 构造的对象都有一个 to_pickle 方法&#xff0c;该方法以 pickle 格式将数据写入磁盘。 我们先把之前示例用到的ex1.csv文件加载到pandas对象中…...

matlab计算相关物理参数

function Rx1Jetfire1_1(di,Ct,Tf,Tj,alpha,Ma,Mf,RH,P0,P,k,Cd,elta,deltaHc,tau,directory) % 一共15个独立变量&#xff0c;为了方便输入修改&#xff0c;所有变量存入Jetfire1_1excel表&#xff0c; % dj为孔口直径,m&#xff1b;Ct为燃料空气混合摩尔系数&#xff0c;可…...

nmcli、ip、ifcfg配置网络区分方法

文章目录 一、检查NetworkManager状态使用nmcli命令&#xff1a;检查NetworkManager服务状态&#xff1a; 二、检查ip命令的使用三、检查ifcfg文件查看/etc/sysconfig/network-scripts/目录&#xff1a;查看/etc/network/interfaces文件&#xff08;针对Debian系&#xff09;&a…...

第四届智能电力与系统国际学术会议(ICIPS 2024)

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus 三、大会介绍 四、出席嘉宾 五、征稿主题 如想"投稿…...

区块链样题第4套解析 后端应用开发部分

任务3-2:区块链应用后端开发 使用JAVA-SDK与区块链进行交互,通过solc2Java工具将Solidity智能合约转译为可供Java调用的文件,实现区块链编程。 前言:题目只是单纯考了对于fisco-java-sdk的简单使用 教程参考: 1.这边建议还是学习完JavaWeb课程。 黑马程序员JavaWeb...

C语言实现408考研真题2016年43题

#include <iostream> // 定义分区函数&#xff0c;返回两个子数组之和的差值 int setPartition(int a[], int n) { int pivotkey, low 0, low0 0, high n - 1, high0 n - 1, flag 1, k n / 2, i; int s1 0, s2 0; // 当low等于k-1&#xff0c;…...

2024年,Rust开发语言,现在怎么样了?

Rust开发语言有着一些其他语言明显的优势&#xff0c;但也充满着争议&#xff0c;难上手、学习陡峭等。 Rust 是由 Mozilla 主导开发的通用、编译型编程语言&#xff0c;2010年首次公开。 在 Stack Overflow 的年度开发者调查报告中&#xff0c;Rust 连续多年被评为“最受喜爱…...

三种网络配置方法nmcli、ip、ifcfg文件

文章目录 总结nmcli配置网络定义与功能&#xff1a;特点&#xff1a;示例&#xff1a; ip配置网络定义与功能&#xff1a;特点&#xff1a;示例&#xff1a; ifcfg配置网络定义与功能&#xff1a;特点&#xff1a;示例&#xff1a; 总结 nmcli&#xff1a;适合需要动态管理网络…...

AES_ECB算法C++与Java相互加解密Demo

一、AES算法 AES是一种对称加密算法&#xff0c;算法秘钥长度可为128位(16字节)、192位(24字节)、256位(32字节)。加密模式分为ECB、CBC、CTR等&#xff0c;其中ECB模式最简单够用。现给出ECB模式下C和Java的实现&#xff0c;并且可以相互加解密验证。 二、AES_ECB实现DEMO …...

H7-TOOL自制Flash读写保护算法系列,为兆易创新GD32E23X制作使能和解除算法,支持在线烧录和脱机烧录使用(2024-10-29)

说明&#xff1a; 很多IC厂家仅发布了内部Flash算法文件&#xff0c;并没有提供读写保护算法文件&#xff0c;也就是选项字节算法文件&#xff0c;需要我们制作。 实际上当前已经发布的TOOL版本&#xff0c;已经自制很多了。但是依然有些厂家还没自制&#xff0c;所以陆续开始…...

FFmpeg 深度教程音视频处理的终极工具

1. 引言 什么是 FFmpeg&#xff1f; FFmpeg 是一个开源的跨平台多媒体处理工具&#xff0c;广泛应用于音视频的录制、转换、流式传输以及编辑等多个领域。它由 FFmpeg 项目团队开发和维护&#xff0c;支持几乎所有主流的音视频格式和编解码器。FFmpeg 包含了一系列强大的命令…...

Java程序设计:spring boot(13)——全局异常与事务控制

1 Spring Boot 事务支持 在使⽤ Jdbc 作为数据库访问技术时&#xff0c;Spring Boot框架定义了基于jdbc的PlatformTransaction Manager 接⼝的实现 DataSourceTransactionManager&#xff0c;并在 Spring Boot 应⽤ 启动时⾃动进⾏配置。如果使⽤ jpa 的话 Spring Boot 同样提供…...

金和OA-C6 ApproveRemindSetExec.aspx XXE漏洞复现(CNVD-2024-40568)

0x01 产品描述&#xff1a; 金和C6协同管理平台是以"精确管理思想"为灵魂&#xff0c;围绕“企业协同四层次理论”模型&#xff0c;并紧紧抓住现代企业管理的六个核心要素&#xff1a;文化 Culture、 沟通Communication 、 协作Collaboration 、创新 Creation、 控制…...

Redis集群及Redis存储原理

Redis存储原理 Redis将内存划分为16384个区域(类似hash槽) 将数据的key使用CRC16算法计算出一个值,取余16384 得到的结果是0~16383 将这个key保存在计算结果对应的槽位 再次查询这个key时,直接到这个槽位查找,效率很高 实际上这就是"散列表" 提高查询的效率 R…...

基于Springboot的图书个性化推荐系统【源码】+【论文】

图书个性化推荐系统是一个基于Java语言和Springboot框架开发的Web应用系统&#xff0c;主要为管理员和学生提供个性化图书推荐、图书预约和管理功能。系统通过管理员和学生的不同权限设置&#xff0c;实现了图书分类管理、预约管理、退换图书管理、留言板管理等全面的功能&…...

科普 | 子母钟系统是什么?网络时钟同步的重要性?

科普 | 子母钟系统是什么&#xff1f;网络时钟同步的重要性&#xff1f; 科普 | 子母钟系统是什么&#xff1f;网络时钟同步的重要性&#xff1f; 在信息时代的今天&#xff0c;准确统一的时钟系统已广泛的应用在车站、医院、学校、机场等公共服务场所。 因此完善的时钟系统对…...

批量删除redis数据【亲测可用】

文章目录 引言I redis客户端基础操作key的命名规则批量查询keyII 批量删除key使用连接工具进行分组shell脚本示例其他方法III 知识扩展:控制短信验证码获取频率引言 批量删除redis数据的应用: 例如缓存数据使用了新的key存储,需要删除废弃的key。RedisTemplate的key序列化采…...

Vuestic 数据表格 使用demo

<template><br><div class"grid sm:grid-cols-3 gap-6 mb-6"><VaButton click"()>{for(const it in this.selectedItems){console.log(this.selectedItems);}}">参数设置</VaButton><VaButton>参数刷新</VaButt…...

考勤无忧,Zoho People助HR高效

云考勤系统提升数据准确性、无缝对接业务、节省成本、提高员工效率、保障安全。ZohoPeople作为云HRMS&#xff0c;集成考勤管理等功能&#xff0c;支持试用&#xff0c;助力企业高效管理。 一、使用云考勤管理系统&#xff0c;有哪些好处&#xff1f; 1、数据准确性得到保障 …...

已知一个法向量和一个点,求该平面的ModelCoefficients,并使用ProjectInliers将点云投影到该平面

#include <pcl/point_cloud.h> #include <pcl/point_types.h> #include <pcl/filters/project_inliers.h> #include <pcl/model_coefficients.h>// 假设法向量和一个点已知 float A 1.0; // 法向量的 x 分量 float B 0.0; // 法向量的 y 分量 floa…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...