当前位置: 首页 > 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…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

使用 ROS1-Noetic 和 mavros v1.20.1&#xff0c; 携带经纬度海拔的话题主要有三个&#xff1a; /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码&#xff0c;来分析他们的发布过程。发现前两个话题都对应了同一…...