点击上方关注,All in AI中国

Pandas已经成为最受欢迎的数据科学库之一。它易于使用,文档非常棒,而且功能强大。

然而,无论使用哪一个库,大型的数据集总是会带来额外的挑战,这些是需要谨慎处理的。

你一开始遇到硬件障碍,是因为您没有足够的内存来保存所有数据。尤其是遇到企业公司存储的数据集最多可达到100GB或甚至1000的GB的情况。

即使你确实是购买了足够内存来存储所有数据的计算机,将其读入内存中的速度也会非常慢。

但是Pandas库将再次帮助我们。本文将讨论三种技巧,你可以使用它们来减少大数据集的内存占用和读取时间。我已经尝试将这些技术用于超过100GB大小的数据集,并将它们压缩到只有64 GB甚至32GB RAM的机器上。

下面让我们来看看吧!

整理你的数据

CSV格式是一种非常方便的数据存储方式,易于编写且人们可读。 另外,有一个很好的pandas函数read_csv()用于加载存储为CSV的数据。但是当你的CSV太大以至于内存不足时会发生什么?有一个非常简单的Pandas技巧来处理它! 我们并不是尝试去一次性处理我们的数据,而是将它们分成几个部分。 通常,这些部分称为块。块只是我们数据集的一部分。 我们可以根据需要去制作成大块或小块,这取决于我们有多少内存。

这个过程是这样进行的:

  1. 先读入一大块
  2. 并处理块
  3. 保存块的结果
  4. 重复步骤1到3,直到得到所有块结果
  5. 组合块的结果

我们可以使用名为chunksize的read_csv()函数的方便变量来执行上述所有步骤。chunksize表示一次读取多少CSV行。这当然取决于您有多少内存以及每一行有多大。

如果我们认为我们的数据像高斯分布一样很容易处理,那么我们就可以一对一的,对每个块执行我们想要的处理和可视化,因此不会损失太多的准确性。

如果我们的分布有点像泊松分布那样复杂,那么最好在处理之前过滤每个块并将所有小块放在一起。大多数情况下,您最终会删除许多不相关的列或删除缺少值的行。我们可以对每个块都这样做,使它们更小,然后将它们放在一起,并对最终的数据文件执行数据分析。

以下的代码执行了这些步骤。

删除数据

有时候,我们会先知道我们想要分析数据集中的哪些列。事实上,通常情况下,有几个或多个列是我们不关心的。

在读取数据之前直接跳过列可以节省大量内存。pandas允许我们,而且指定我们想要读取的列:

丢弃包含没有用的信息的列,将是节省内存的方法之一。

我们可以做的另一件事是过滤掉任何缺失或NA值的行。这是用dropna()函数最简单的:

有一些非常有用的变量,我们可以传递给dropna():

方法:

这将允许你指定”any”(如果其中任何列是NA,则删除一行)或”all”(仅当所有列都是NA时,才删除一行)

thresh:设置一个阈值,表示要删除一行需要多少个NA值

subset:选择将考虑用于检查NA值的列子集

你可以使用这些参数,尤其是thresh和subset来真正具体了解哪些行将被删除。

Pandas在读取时没有像列一样的方法来做这个,但我们可以像上面那样在每个块上做到这一。

为每一列设置特定的数据类型

对于许多初学数据科学家来说,为每列设置特定数据类型数据类型,并没有在过多考虑范围之内。 但是一旦开始处理非常大的数据集时,处理数据类型就变得至关重要。

通常的做法是读取dataframe,然后根据需要转换列的数据类型。但是对于一个大的数据集,我们真的必须注意内存空间。CSV中可能有一些列,比如浮点数,它们将占用比它们需要的更多的空间。例如,如果我们下载了一个用于预测股票价格的数据集,我们的价格可能被保存为32位浮点数!

但我们真的需要32个浮点数(float)吗?大多数情况下,股票是以小数点后两位指定的价格买进的。即使我们想要非常精确,浮点数16也足够了。

因此,我们不是使用列的原始数据类型读入数据集,而是指定我们希望pandas在我们的列中使用读取的数据类型。 这样,我们永远不会消耗比实际需要更多的内存。

使用read_csv()函数中的dtype参数很容易做到这一点。我们可以指定一个字典,其中每个键是数据集中的一列,每个值是我们希望使用该键的数据类型。

举个pandas的例子:

我们的教程到此结束!希望这三个技巧能帮你节省很多时间和内存!

编译出品