pandas DataFrame内存优化技巧:让数据处理更高效

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

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

在这个信息爆炸的时代,数据规模呈指数级增长,如何优化内存使用,不仅关乎到程序的稳定运行,更直接关系到数据处理的效率和准确性。

通过本文,你将了解到一些实用的内存优化技巧,帮助你在处理大规模数据集时更加得心应手。

1. 准备数据

首先,准备一些包含各种数据类型的测试数据集。

封装一个函数(fake_data),用来生成数据集,数据集中包含后面用到的几种字段。

python 复制代码
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

python 复制代码
df = fake_data(1_000_000)
df.head()

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

python 复制代码
df.info()

内存占用大约 26.7MB 左右。

3. 优化内存

接下来,我们开始一步步优化DataFrame的内存占用,

并测试每一步优化之后的内存使用情况和运行性能变化。

3.1. 优化整型数据

首先,优化整型数据的内存占用,也就是测试数据中的年龄age)字段。

从上面df.info()的结果中,我们可以看出,age的类型是int32(也就是用32位,8个字节来存储整数)。

对于年龄 来说,用不到这么大的整数,用int8(数值范围:-128~127)来存储绰绰有余。

python 复制代码
df["age"] = df["age"].astype("int8")
df.info()

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

3.2. 优化浮点型数据

接下来优化浮点类型 数据,也就是测试数据中的能力评估值ability)。

测试数据中ability的值是6位小数,类型是float64

转换成float16可能会改变值,所以这里转换成float32

python 复制代码
df["ability"] = df["ability"].astype("float32")
df.info()

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

3.3. 优化布尔型数据

接下来,优化测试数据中的是否合格qualified),

这个值虽然是字符串类型 ,但是它的值只有两种(合格不合格 ),所以可以转换成布尔类型

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

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

3.4. 使用category类型

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

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

python 复制代码
df["grade"] = df["grade"].astype("category")
df.info()

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

4. 总结

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

仅仅是数据类型的简单调整,就带来了如此之大的内存效率提升,

这也给我们带来启示,在数据分析的过程中,构造DataFrame时,也可以根据数值的范围,特点等,

来赋予它合适的类型,不要一味简单的使用字符串,或者默认的整数(int32),默认的浮点(float64)等类型。

相关推荐
CSXB9916 分钟前
三十四、Python基础语法(文件操作-上)
开发语言·python·功能测试·测试工具
RestCloud1 小时前
ETLCloud异常问题分析ai功能
人工智能·ai·数据分析·etl·数据集成工具·数据异常
亚图跨际1 小时前
MATLAB和Python及R潜变量模型和降维
python·matlab·r语言·生物学·潜变量模型
IT古董1 小时前
【机器学习】决定系数(R²:Coefficient of Determination)
人工智能·python·机器学习
德育处主任Pro1 小时前
『Django』APIView基于类的用法
后端·python·django
Star Patrick1 小时前
算法训练(leetcode)二刷第十九天 | *39. 组合总和、*40. 组合总和 II、*131. 分割回文串
python·算法·leetcode
武子康2 小时前
大数据-213 数据挖掘 机器学习理论 - KMeans Python 实现 距离计算函数 质心函数 聚类函数
大数据·人工智能·python·机器学习·数据挖掘·scikit-learn·kmeans
写点什么啦2 小时前
使用R语言survminer获取生存分析高风险和低风险的最佳截断值cut-off
开发语言·python·r语言·生存分析·x-tile
武子康2 小时前
大数据-214 数据挖掘 机器学习理论 - KMeans Python 实现 算法验证 sklearn n_clusters labels
大数据·人工智能·python·深度学习·算法·机器学习·数据挖掘
Aloudata3 小时前
NoETL自动化指标平台为数据分析提质增效,驱动业务决策
大数据·数据分析·指标平台·指标体系