我们在使用pandas处理完数据之后,最终总是要把数据作为一个文件保存下来,
那么,保存数据最常用的文件是什么呢?
我想大部分人一定会选择csv或者excel

刚接触数据分析时,我也是这么选择的,不过,今天将介绍几种不一样的存储数据的文件格式。
这些文件格式各有自己的一些优点,希望本文能让你以后的数据存储方式能有不一样的选择,从而存储的更加专业。

1. 准备数据

本次使用的数据来自A股2023年全年的日交易数据。
数据下载地址:https://databook.top/。

导入数据:

import pandas as pd

fp = "d:/share/历史行情数据-不复权-2023.csv"

df = pd.read_csv(fp)
df


总共大约120多万条数据。

准备好测试数据之后,开始测试各种文件的效果。

2. CSV

使用pandas做数据分析时,保存数据最常用的格式一定是CSV(或者excel)。
因为CSV格式易于分享,用excel或者文本编辑器都能直接打开。

但是当数据集规模比较大时,它的磁盘利用率和读写效率究竟如何呢?
首先我们把准备的数据保存为一个测试用的test.csv文件。

df = pd.read_csv(fp)
df.to_csv("d:/share/test.csv", index=None)

看看文件大小:

ls .\test.csv

    目录: D:\share

Mode                 LastWriteTime         Length Name
---- ------------- ------ ----
-a---- 2024/03/15 10:41:27 101411037 test.csv

test.csv文件大约:\(101411037/1024/1024 \approx 96.7MB\)

读取效率:

%%timeit
df = pd.read_csv("d:/share/test.csv")
1.73 s ± 54.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

写入的效率:

%%timeit
df.to_csv("d:/share/test.csv", index=None)
13.2 s ± 402 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

3. Pickle

Pickle格式是一种用于序列化和反序列化Python对象结构二进制格式
它的主要特点是能够将程序中运行的对象信息保存到文件中。

下面,我们先把准备的数据保存为一个测试用的test.pkl文件。

# pickle file
df = pd.read_csv(fp)
df.to_pickle("d:/share/test.pkl")

文件大小:

ls .\test.pkl

    目录: D:\share

Mode                 LastWriteTime         Length Name
---- ------------- ------ ----
-a---- 2024/03/15 10:49:09 116904470 test.pkl

test.pkl文件大约:\(116904470/1024/1024 \approx 111.5MB\)

读取效率:

%%timeit
df = pd.read_pickle("d:/share/test.pkl")
136 ms ± 5.09 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

写入效率:

%%timeit
df.to_pickle("d:/share/test.pkl")
182 ms ± 7.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

4. Parquet

Parquet格式是一种列式存储格式,被广泛应用于大数据处理领域。
它采用了压缩和编码技术,能够有效地存储和压缩数据,同时保持数据的结构和模式。

下面,我们先把准备的数据保存为一个测试用的test.parquet文件。

# parquet file
df = pd.read_csv(fp)
df.to_parquet("d:/share/test.parquet")

文件大小:

ls .\test.parquet

    目录: D:\share

Mode                 LastWriteTime         Length Name
---- ------------- ------ ----
-a---- 2024/03/15 10:52:08 32964728 test.parquet

test.parquet文件大约:\(32964728/1024/1024 \approx 31.4MB\)

读取效率:

%%timeit
df = pd.read_parquet("d:/share/test.parquet")
200 ms ± 8.54 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

写入效率:

%%timeit
df.to_parquet("d:/share/test.parquet")
1.23 s ± 62.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

5. Feather

Feather格式是一种高速、轻量且易于使用的二进制文件格式,专门用于存储数据帧。
Feather的主要目标是提供高性能的读写操作。

下面,我们先把准备的数据保存为一个测试用的test.feather文件。

# feather file
df = pd.read_csv(fp)
df.to_feather("d:/share/test.feather")

文件大小:

ls .\test.feather

    目录: D:\share

Mode                 LastWriteTime         Length Name
---- ------------- ------ ----
-a---- 2024/03/15 11:17:15 57347098 test.feather

test.feather文件大约:\(57347098/1024/1024 \approx 54.7MB\)

读取效率:

%%timeit
df = pd.read_feather("d:/share/test.feather")
130 ms ± 5.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

写入效率:

%%timeit
df.to_feather("d:/share/test.feather")
277 ms ± 14.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

6. 总结

pandas能够保存的文件格式有很多,比如还有XMLJSONHTML等等,
上面列出的4种是我认为比较典型,且在数据分析领域用的比较多的格式。

4种格式的比较总结如下:

磁盘占用 读取效率 写入效率
csv 96.7 MB 1.73 s ± 54.7 ms 13.2 s ± 402 ms
pickle 111.5 MB 136 ms ± 5.09 ms 182 ms ± 7.42 ms
parquet 31.4 MB 200 ms ± 8.54 ms 1.23 s ± 62.4 ms
feather 54.7 MB 130 ms ± 5.29 ms 277 ms ± 14.8 ms

综合来看,当我们的数据量不大的时候,用CSV格式比较好,分享方便,可以用多种编辑器直接打开查看。
当数据规模变大了之后,如果数据需要长期存储,而且不需要经常的更新写入,那么用parquet格式(它的磁盘占用最低,读取性能好,写入性能略逊);
如果只要短期存储的话,用fetdher格式更好(磁盘占用不算高,读写性能都不错)。

至于pickle格式,它的读写性能也不错,但它的最大优势是可以保存python对象的状态,只用来保存数据的话,这个优势难以体现。
而且它的磁盘占用比较大,单纯保存数据的话,不建议使用这种格式。

pandas:如何保存数据比较好?的更多相关文章

  1. pandas读取保存数据

    将本人使用过的一些操作记录下来 1.读取数据,使用:data = pd.read_csv('./data/file.csv') 2.数据处理,如果你要修改某一个数据,其实把DATAFRAME数据看做是 ...

  2. pandas+sqlalchemy 保存数据到mysql

    import pandas as pd from sqlalchemy import create_engine data3={"lsit1":[1,2],"lsit2& ...

  3. pandas学习(常用数学统计方法总结、读取或保存数据、缺省值和异常值处理)

    pandas学习(常用数学统计方法总结.读取或保存数据.缺省值和异常值处理) 目录 常用数学统计方法总结 读取或保存数据 缺省值和异常值处理 常用数学统计方法总结 count 计算非NA值的数量 de ...

  4. [数据清洗]-使用 Pandas 清洗“脏”数据

    概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 重命名列名 保存结果 更多资源 Pandas 是 Python 中很流行的类库,使用它可 ...

  5. [数据清洗]-Pandas 清洗“脏”数据(一)

    概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 重命名列名 保存结果 更多资源 Pandas 是 Python 中很流行的类库,使用它可 ...

  6. Python 保存数据的方法(4种方法)

    Python 保存数据的方法: open函数保存 使用with open()新建对象 写入数据(这里使用的是爬取豆瓣读书中一本书的豆瓣短评作为例子) import requests from lxml ...

  7. Pandas透视表处理数据(转)

    手把手教你用Pandas透视表处理数据(附学习资料) 2018-01-06 数据派THU 来源:伯乐在线 -  PyPer 本文共2203字,建议阅读5分钟.本文重点解释pandas中的函数pivot ...

  8. Python 保存数据的方法:

    open函数保存 使用with open()新建对象 写入数据(这里使用的是爬取豆瓣读书中一本书的豆瓣短评作为例子) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  9. [开发技巧]·pandas如何保存numpy元素

    [开发技巧]·pandas如何保存numpy元素 ​ 1.问题描述 在开发的过程中遇到一个问题,就是需要把numpy作为pandas的一个元素进行保存,注意不是作为一列元素.但是实践的过程中却不顺利, ...

  10. EasyUI使用JSON保存数据

    目前来说,使用JSON保存数据比较方便,前台可以不用Test.aspx 页面,可以直接用Html页面,使用.aspx页面的弊端就不在这里熬述. 具体步骤如下: 1.新建一个Html页面,命名为Test ...

随机推荐

  1. 3.4 CSP-J 补赛游寄

    3.4 CSP-J 补赛游寄 Day -? 听说要去打比赛. Day -7 今天家长会,老师公布成绩 /fn/fn/fn.政治考废了,然后其他都挺好. 语文 $ 95 $,数学 $ 118 $,英语 ...

  2. 48从零开始用Rust编写nginx,搭建一个简单又好看官方网站

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...

  3. 大数据技术之DataX

    一.DataX简介 DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之 ...

  4. MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket

    MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket 一.错误现场还原: 下面我们通过三种方式 ...

  5. [JVM] JVM的类加载机制

    JVM的类加载 首先我们来看下Java虚拟机的类加载过程: 如上图. 当JVM需要用到某个类的时候,虚拟机会加载它的 .class 文件.加载了相关的字节码信息之后,会常见对应的 Class 对象,这 ...

  6. Java 递归的方式将list集合的某一字段拼接单个String

    场景介绍 要将list 集合中的某一个字段合并成一个字符串,并且要用符号 "|" 分割开每个拼接后的字段. 一个例子胜于一切的文字表达,拼接后的结果如下 str1|str2|str ...

  7. 【OpenGL ES】渲染管线

    1 前言 ​ 渲染管线是指图形渲染流程,涉及到的概念非常多,主要包含图元.片段.光栅化.空间.变换.裁剪.着色器.片段测试.混合等.渲染管线主体流程如下: ​ 为方便读者理解渲染管线,本文将先介绍顶点 ...

  8. 如何获取oracle dbid

    1.查询v$database获得 由于DBID在控制文件和数据文件中都存在记录,所以如果能够mount数据库就可以查询v$database视图获得.  SQL> alter database m ...

  9. python第二章pta习题总结

    chapter2 一.选择填空判断部分 1. C语言中,变量变的是内存空间中的值,不变的是地址: Python中,变量变的是地址,不变的是内存空间中的值. 2. 3.bool('False') 的返回 ...

  10. Go语言并发编程(1):对多进程、多线程、协程和并发、并行的理解

    一.进程和线程 对操作系统进程和线程以及协程的了解,可以看看我前面的文章: 对进程.线程和协程的理解以及它们的区别:https://www.cnblogs.com/jiujuan/p/16193142 ...