首页 > 编程语言 >Python数据分析NumPy和pandas(十七、pandas 二进制格式文件处理)

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

时间:2024-10-31 10:16:30浏览次数:7  
标签:HDF5 Python frame 格式文件 examples pd pandas store

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

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

import pandas as pd

frame = 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 pd

frame = 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 pd

frame = 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 pd

frame = 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 pd

frame = 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 os

os.remove("examples/mydata.h5")

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

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

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

标签:HDF5,Python,frame,格式文件,examples,pd,pandas,store
From: https://blog.csdn.net/FreedomLeo1/article/details/143366362

相关文章

  • Python数据分析NumPy和pandas(十六、文本格式数据的读取与存储:csv、json、xml和html)
    一、分段读取文本文件在处理非常大的文件时,未找到合适的数据处理方法前,我们一般希望只读取文件的一小部分或遍历文件的较小块来做预处理或参考。这种情况可以采用分段读取文本文件的方式。我们加载一个10000行的ex6.csv文件,其内容如下:一般情况下,对于pandas读取大文件数据时......
  • python进度库-tqdm的自定义能力
    今天罗列几个关于tqdm常见自定义场景。并尝试对动态更新描述信息做简单的封装,积累一些通用模块。tqdm 提供了丰富的自定义选项,可以让你根据不同的需求调整进度条的外观和行为,接下来看看他的自定义能力。tqdm函数参数:desc:进度条的描述信息。total:总迭代次数(默认为None......
  • Python 进度条模块tqdm
    1.简介在处理大规模数据或长时间运行的任务时,了解任务的进度对于用户体验和调试来说非常重要。tqdm是一个用于显示进度条的Python库,它能将任务的进度信息直观地展示出来。无论是遍历一个大型列表、处理批量数据,还是下载文件,tqdm都能轻松实现进度条显示,并且与Python的标准......
  • python3 tcp_client
    tcp_client.py#-*-coding:utf-8-*-#tcp客户端,使用单例模式实现#create:2023-06-26importsocketimporttimeimporttracebackclassTCPConnection:__instance=None#存储单例对象的类属性def__new__(cls,host,port):"""实现......
  • Python 自动化运维:日志与监控的深度探索
    Python自动化运维:日志与监控的深度探索目录......
  • Python学习15天
    if 条件表达式:(条件为真,执行代码块1,否则执行代码块2)   代码块1else:   代码块2#键盘输入成绩,若成绩大于60,输出及格,否则输出不及格score=int(input("请输入成绩:"))ifscore>60:   print("及格")else:   print("不及格")#键盘输入年份,判断是......
  • Python学习第14天
    ~:按位取反,把数据的每个二进制按位取反~5:5=00000101(原码=反码=补码)~5=11111010(补码)-(反码=补码-1)=11111001-原码=00000110=6~5=6print(~5)~-3=2print(~-3)-3>原码=10000011>反码=11111100>补码=11111101~-3=00000010(补码=反码=原码)=2&:按位与:两个值都为1则......
  • Python 程序打包成 EXE 文件及相关操作详解
    Python程序打包成EXE文件及相关操作详解一、引言在Python开发中,有时我们希望将编写的程序打包成可独立执行的EXE文件,以便在没有安装Python环境的计算机上运行。同时,为了使生成的可执行文件更具辨识度和美观性,我们还可以为其指定一个自定义图标。本文将详细介绍如......
  • Python 标准库——argparse模块
    文章目录前言一、主要作用二、基本步骤1.导入模块2.创建解析器对象3.添加参数4.解析参数5.使用解析后的参数6.编写主函数并调用三、函数示例前言argparse是Python标准库中的一个模块,用于编写用户友好的命令行接口。它允许你轻松地定义程序应该接受的命令行参数,并......
  • D53【python 接口自动化学习】- python基础之模块与标准库
    day53自定义模块学习日期:20241030学习目标:模块与标准库--67自定义模块:如何编写一个完整功能?学习笔记:创建自定义模块自定义模块注意事项 自定义模块deffunc1():return'thisisafunction'classClass1(object):def__init__(self):print(......