APP下载

资料进食者Pandas:3大方法减少内存占用和读取时间

消息来源:baojiabao.com 作者: 发布时间:2024-06-01

报价宝综合消息资料进食者Pandas:3大方法减少内存占用和读取时间

全文共1713字,预计学习时长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垂类自媒体 “读芯术”

2019-10-05 23:52:00

相关文章