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

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

Pandas无疑是我们数据分析时一个不可或缺的工具,它以其强大的数据处理本领、灵活的数据结构以及易于上手的API赢得了广大数据分析师和机器学习工程师的喜爱。
然而,随着数据量的不断增长,怎样高效、公道地管理内存,确保Pandas DataFrame在运行时不会因内存不足而崩溃,成为我们每一个人必须面临的问题。
在这个信息爆炸的期间,数据规模呈指数级增长,怎样优化内存使用,不仅关乎到程序的稳定运行,更直接关系到数据处理的效率和准确性。通过本文,你将了解到一些实用的内存优化技巧,帮助你在处理大规模数据集时更加得心应手。
1. 准备数据

起首,准备一些包含各种数据类型的测试数据集。
封装一个函数(fake_data),用来天生数据集,数据集中包含后面用到的几种字段。
  1. import pandas as pd
  2. import numpy as np
  3. def fake_data(size):
  4.     """
  5.     根据测试数据集:
  6.     age:整数类型数值
  7.     grade:有限个数的字符串
  8.     qualified:是否合格
  9.     ability:能力评估,浮点类型数值
  10.     """
  11.     df = pd.DataFrame()
  12.     df["age"] = np.random.randint(1, 30, size)
  13.     df["grade"] = np.random.choice(
  14.         [
  15.             "一年级",
  16.             "二年级",
  17.             "三年级",
  18.             "四年级",
  19.             "五年级",
  20.             "六年级",
  21.         ],
  22.         size,
  23.     )
  24.     df["qualified"] = np.random.choice(["合格", "不合格"], size)
  25.     df["ability"] = np.random.uniform(0, 1, size)
  26.     return df
复制代码
2. 检测内存占用

使用上面封装的函数(fake_data)先构造一个包含一百万条数据的DataFrame。
  1. df = fake_data(1_000_000)
  2. df.head()
复制代码

看看优化前的内存占用情况:
  1. df.info()
复制代码

内存占用大约 26.7MB 左右。
3. 优化内存

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

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

优化之后,内存占用从26.7+ MB减到23.8+ MB。
3.2. 优化浮点型数据

接下来优化浮点类型数据,也就是测试数据中的本领评估值(ability)。
测试数据中ability的值是6位小数,类型是float64,
转换成float16可能会改变值,以是这里转换成float32。
  1. df["ability"] = df["ability"].astype("float32")
  2. df.info()
复制代码

优化之后,内存占用进一步从23.8+ MB减到20.0+ MB。
3.3. 优化布尔型数据

接下来,优化测试数据中的是否合格(qualified),
这个值虽然是字符串类型,但是它的值只有两种(合格不合格),以是可以转换成布尔类型
  1. df["qualified"] = df["qualified"].map({"合格": True, "不合格": False})
  2. df.info()
复制代码

优化之后,内存占用进一步从20.0+ MB减到13.4+ MB。
3.4. 使用category类型

最后,我们再优化剩下的字段--年级(grade)。
这个字段也是字符串,不外它的值只有6个,虽然无法转换成布尔类型(布尔类型只有两种值True和False),但是它可以转换为pandas中的 category 类型。
  1. df["grade"] = df["grade"].astype("category")
  2. df.info()
复制代码

优化之后,内存占用进一步从13.4+ MB减到6.7+ MB。
4. 总结

各类字段优化之后,内存占用从刚开始的26.7+ MB减到6.7+ MB,优化的结果非常明显。
仅仅是数据类型的简单调整,就带来了云云之大的内存效率提升,
这也给我们带来启示,在数据分析的过程中,构造DataFrame时,也可以根据数值的范围,特点等,
来赋予它符合的类型,不要一味简单的使用字符串,或者默认的整数(int32),默认的浮点(float64)等类型。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表