Pandas无疑是我们数据分析时一个不可或缺的工具,它以其强大的数据处理能力、灵活的数据结构以及易于上手的API赢得了广大数据分析师和机器学习工程师的喜爱。

然而,随着数据量的不断增长,如何高效、合理地管理内存,确保Pandas DataFrame在运行时不会因内存不足而崩溃,成为我们每一个人必须面对的问题。

在这个信息爆炸的时代,数据规模呈指数级增长,如何优化内存使用,不仅关乎到程序的稳定运行,更直接关系到数据处理的效率和准确性。通过本文,你将了解到一些实用的内存优化技巧,帮助你在处理大规模数据集时更加得心应手。

1. 准备数据

首先,准备一些包含各种数据类型的测试数据集。
封装一个函数(fake_data),用来生成数据集,数据集中包含后面用到的几种字段。

import pandas as pd
import numpy as np def fake_data(size):
"""
根据测试数据集:
age:整数类型数值
grade:有限个数的字符串
qualified:是否合格
ability:能力评估,浮点类型数值
"""
df = pd.DataFrame()
df["age"] = np.random.randint(1, 30, size)
df["grade"] = np.random.choice(
[
"一年级",
"二年级",
"三年级",
"四年级",
"五年级",
"六年级",
],
size,
)
df["qualified"] = np.random.choice(["合格", "不合格"], size)
df["ability"] = np.random.uniform(0, 1, size) return df

2. 检测内存占用

使用上面封装的函数(fake_data)先构造一个包含一百万条数据的DataFrame

df = fake_data(1_000_000)
df.head()

看看优化前的内存占用情况:

df.info()


内存占用大约 26.7MB 左右。

3. 优化内存

接下来,我们开始一步步优化DataFrame的内存占用,
并测试每一步优化之后的内存使用情况和运行性能变化。

3.1. 优化整型数据

首先,优化整型数据的内存占用,也就是测试数据中的年龄age)字段。
从上面df.info()的结果中,我们可以看出,age的类型是int32(也就是用32位,8个字节来存储整数)。
对于年龄来说,用不到这么大的整数,用int8(数值范围:-128~127)来存储绰绰有余。

df["age"] = df["age"].astype("int8")
df.info()


优化之后,内存占用从26.7+ MB减到23.8+ MB

3.2. 优化浮点型数据

接下来优化浮点类型数据,也就是测试数据中的能力评估值ability)。
测试数据中ability的值是6位小数,类型是float64
转换成float16可能会改变值,所以这里转换成float32

df["ability"] = df["ability"].astype("float32")
df.info()


优化之后,内存占用进一步从23.8+ MB减到20.0+ MB

3.3. 优化布尔型数据

接下来,优化测试数据中的是否合格qualified),
这个值虽然是字符串类型,但是它的值只有两种(合格不合格),所以可以转换成布尔类型

df["qualified"] = df["qualified"].map({"合格": True, "不合格": False})
df.info()


优化之后,内存占用进一步从20.0+ MB减到13.4+ MB

3.4. 使用category类型

最后,我们再优化剩下的字段--年级grade)。

这个字段也是字符串,不过它的值只有6个,虽然无法转换成布尔类型(布尔类型只有两种值TrueFalse),但是它可以转换为pandas中的 category 类型。

df["grade"] = df["grade"].astype("category")
df.info()


优化之后,内存占用进一步从13.4+ MB减到6.7+ MB

4. 总结

各类字段优化之后,内存占用从刚开始的26.7+ MB减到6.7+ MB,优化的效果非常明显。

仅仅是数据类型的简单调整,就带来了如此之大的内存效率提升,
这也给我们带来启示,在数据分析的过程中,构造DataFrame时,也可以根据数值的范围,特点等,
来赋予它合适的类型,不要一味简单的使用字符串,或者默认的整数(int32),默认的浮点(float64)等类型。

pandas DataFrame内存优化技巧:让数据处理更高效的更多相关文章

  1. 内存管理 & 内存优化技巧 浅析

    内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户 ...

  2. github 项目搜索技巧-让你更高效精准地搜索项目

    目录 github 搜索技巧 案例 普通搜 搭配技巧搜 限定词 查找某个用户或组织的项目 辅助限定词 还没搞懂的(关于 forks.mirror.issues) 排序(放的是官网的链接) 使用指南 练 ...

  3. redis的内存优化【转】

    Redis所有的数据都在内存中,而内存又是非常宝贵的资源.对于如何优化内存使用一直是Redis用户非常关注的问题.本文让我们深入到Redis细节中,学习内存优化的技巧.分为如下几个部分: 一.redi ...

  4. Impala内存优化(转载)

    一. 引言 Hadoop生态中的NoSQL数据分析三剑客Hive.HBase.Impala分别在海量批处理分析.大数据列式存储.实时交互式分析各有所长.尤其是Impala,自从加入Hadoop大家庭以 ...

  5. [转]探索 Android 内存优化方法

    前言 这篇文章的内容是我回顾和再学习 Android 内存优化的过程中整理出来的,整理的目的是让我自己对 Android 内存优化相关知识的认识更全面一些,分享的目的是希望大家也能从这些知识中得到一些 ...

  6. Redis之内存优化

    Redis所有的数据都存在内存中,当前内存虽然越来越便宜,但跟廉价的硬盘相比成本还是比较昂贵,因此如何高效利用Redis内存变得非常重要.高效利用Redis内存首先需要理解Redis内存消耗在哪里,如 ...

  7. SQLServer 2014 内存优化表

    内存优化表是 SQLServer 2014 的新功能,它是可以将表放在内存中,这会明显提升DML性能.关于内存优化表,更多可参考两位大侠的文章:SQL Server 2014新特性探秘(1)-内存数据 ...

  8. 由Kaggle竞赛wiki文章流量预测引发的pandas内存优化过程分享

    pandas内存优化分享 缘由 最近在做Kaggle上的wiki文章流量预测项目,这里由于个人电脑配置问题,我一直都是用的Kaggle的kernel,但是我们知道kernel的内存限制是16G,如下: ...

  9. IOS 内存优化和调试技巧

    基础部分 1: 图片内存大小小结 a: 图片:是占用内存的大户,尤其是手机游戏图片资源众多.对图片资源在内存中占用量的计算成为J2ME游戏开发者的经常性工作,CoCoMo来解释一下如何计算图片在内存中 ...

  10. pandas DataFrame 数据处理常用操作

    Xgboost调参: https://wuhuhu800.github.io/2018/02/28/XGboost_param_share/ https://blog.csdn.net/hx2017/ ...

随机推荐

  1. 小知识:MAC上添加小米喷墨打印机

    最近新购一个小米喷墨打印机,价格不贵,可彩打资料,也能打印照片,非常提升家庭幸福感的一件物品: 如果使用手机打印,下载米家打印就非常方便了. 但是有时候需要电脑打印,使用自己电脑添加打印机时遇到一些小 ...

  2. 《ASP.ENT Core 与 RESTful API 开发实战》-- 读书笔记(第2章)

    第 2 章 .NET Core 和 ASP.NET Core 2.1 .NET Core 简介 .NET Core 是一个通用的开发平台,最重要的特点是跨平台,同时也是一个开源平台 .NET Core ...

  3. NC13950 Alliances

    题目链接 题目 题目描述 树国是一个有n个城市的国家,城市编号为1∼n.连接这些城市的道路网络形如一棵树, 即任意两个城市之间有恰好一条路径.城市中有k个帮派,编号为1∼k.每个帮派会占据一些城市,以 ...

  4. NVME学习笔记六—Controller Architecture

    Controller架构   NVMe over Fabrics使用与NVMe基础规格说明书中定义相同的controller架构.这包括主机和controller之间使用SQ提交队列和CQ完成队列来执 ...

  5. 【framework】IMS启动流程

    1 前言 ​ IMS 是 InputManagerService 的简称,主要负责输入事件管理. 1.1 基本概念 输入设备:屏幕.电源/音量.键鼠.充电口.蓝牙.wifi 等 设备节点:当输入设备可 ...

  6. Swoole从入门到入土(9)——TCP服务器[协程风格]

    上一篇,我们一起初步接触了协程.我相信只有一节的讨论,很多小伙伴对于"协程"与"线程"的区分可能还有点模糊.我们这里以两者的比较作为本篇开头,进行一番比较. 首 ...

  7. idea自定义代码片段live template

    1.介绍 有时在idea编辑器经常会写同一个代码块,那么这个代码块就可以利用live template功能把它定义成可根据关键字触发的代码片段,效果如下图: 2.操作步骤 此处我们就以springbo ...

  8. Java中的Try with Resources语句介绍

    1.介绍 从Java7诞生了try-with-resources,这家伙可以在资源使用完后实现自动关闭回收.想想我们之前打开一个文件或流对象用完咋整的,是不是finally语句块中手动close的. ...

  9. oracle goto语句介绍

    以下内容来自oracle plsql user guide. ------------------------------------------------------- 一 定义: The Ora ...

  10. Failed to bind properties under ” to com.zaxxer.hikari.HikariDataSource

    1.问题说明 今天配置spring boot多数据源,同时用到了oracle和postgresql,结果配置完毕后启动报这个错. 2.原因分析 忘记添加postgresql驱动了!!! 3.解决方案 ...