数据进食者Pandas:3大方法减少内存占用和读取时间
Pandas love eating data.
Pandas已经成为最受欢迎的数据科学库之一。它易于使用,内容丰富,且功能强大。
然而,无论使用什么库,大型数据集总是会带来意想不到的挑战,因此需要谨慎处理。
如果使用容量不足的随机存取存储器(RAM)来保存所有数据,就会产生硬件故障。企业公司存储的数据集大小在100GB到1000GB之间。
即使有幸拥有一台足以存储所有数据的机器,仅仅是将数据读入内存这一步就非常慢。
但Pandas库将再次帮助我们解决问题。本文将探讨的三种技术,可减少庞大数据集的内存占用和读取时间。这些技术曾用于处理超过100GB大小的数据集,可以将其压缩至内存为64GB甚至32GB的机器中。一起来看看吧!
来源:Pexels
数据分块
CSV格式是一种非常方便的数据存储方式,易于编写,且具有可读性。此外,pandas函数read_csv()在加载存储为CSV格式的数据方面表现良好。
但如果CSV文件太大,而内存又不够该怎么办?
Pandas可以轻而易举解决这个问题!相比于试图一次性处理所有数据,分块处理更加有效。通常,这些部分被称为“数据块”。
每一数据块只是数据集的一部分。它的大小可以根据内存容量任意变化。过程如下:
1. 读取数据块
2. 处理数据块
3. 保存结果
4. 重复步骤1-3直至得出所有结果
5. 整合所有结果
read_csv()函数中一个名为chunksize的方便变量可以执行上述所有步骤。Chunksize表示一次读取的CSV行数。行数多少取决于内存大小和每一行的大小。
如果数据能够轻松遵循高斯分布等模式,那么可以每次对一个块进行处理,并将其可视化。这种做法不会对其准确性产生很大影响。
如果是像泊松分布这类比较复杂的情况,则最好在处理前过滤每一个数据块,并将各部分整合在一起。大多数情况下,许多不相关的列或存在缺少值的行最终会被删除。对于每个数据块都可以执行此操作,使其变得更小,整合后对最终数据帧进行数据分析。
以下代码可执行所述步骤。
排除无用数据
有时,用户可立即知道想要分析的数据集位于哪几列。事实上,如用户名、账号等列数通常无需处理。
读取数据前直接跳过某几列可以节省大量内存。通过Pandas就可以指定想要读取的列数:
忽略那些包含无用信息的列可以在最大程度上节省内存。
另一种方法是过滤存在缺失或NA值的行。使用dropna() 函数可以轻松做到这一点:
一些有用变量则可以传给 dropna():
· how:该变量可以指定“any”(若某行的任一列均为NA值,则删除该行)或“all”(只有当某行的所有列都是NA值时才可删除一行)
· thresh:设置一个阈值,表示删除一行的NA值数量
· subset:选择一个列的子集,用于检查NA值
这些参数,尤其是thresh和subset,可以确定哪些行将会被删除。
Pandas在读取时没有采用与处理列相同的方法,但上述方法可以用于处理每一个数据块。
为每一列设置特定的数据类型
对于许多初级数据科学家来说,数据类型并非关注的重点。但是一旦开始处理非常庞大的数据集,数据类型就变得非常重要。
通常的做法是读取数据帧,然后根据需要转换某一列的数据类型。但对于一个大的数据集来说,内存空间必须纳入考虑范围。
CSV文件中,浮点数等列占用的空间比实际需要得更多。例如,如果下载一个用于预测股价的数据集,这些股价可能被保存为32位浮点数!
但真的需要32位浮点数吗?很多时候,股票是以小数点后两位的定价买进的。即使要做到更加精确,16位浮点数也足够了。
因此,相比于在数据集中读取列的原始数据类型,在pandas读取列时,设定所希望的数据类型将更加有效。因为这样占用的内存永远也不会超过实际需求量。
使用read_csv() 函数中的dtype参数可以轻松做到这一点。方法是指定一个词典,其中每个键都是数据集中的一列,每个值都是通过使用该键而希望获得的数据类型。
以下是pandas中的一个例子:
今天的教程就到这里,希望这三个方法能有效节约时间、节省内存!
留言 点赞 关注
我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”