如何使用Pandas来处理大量数据但不是大数据

我们用Pandas来处理大量数据,而不是大数据,为什么呢?

作者:Admond Lee
编译:ronghuaiyang

导读

我们用Pandas来处理大量数据,而不是大数据,为什么呢?一起来看看吧。

如何使用Pandas来处理大量数据但不是大数据

pandas是Python编程语言中用于数据整理和分析的最流行和最受欢迎的数据科学工具之一。

在现实世界中,数据的混乱是不可避免。在清理、转换、操作和分析数据方面,pandas是一个“真正的”游戏改变者。简单地说,pandas帮助清理脏乱差。

我的NumPy和Pandas的故事

当我第一次开始学习Python时,我很自然地接触了NumPy(Numerical Python)。它是使用Python进行科学计算的基本包,提供了Python中对n-array和矩阵进行操作的大量有用特性。

此外,该库还提供了对NumPy数组类型的数学操作的向量化,极大地优化了计算,提高了执行速度和性能。

NumPy很酷。

但是仍然存在着对更高层次数据分析工具的一些潜在需求。这就是pandas拯救我的地方。

本质上,pandas的功能构建在NumPy之上,两个库都属于SciPy。这意味着pandas在很大程度上依赖于NumPy数组来实现它的对象来进行操作和计算—但是使用起来更加方便。

在实践中,NumPy和panda仍然可以互换使用。高级的特点和方便的使用决定了我对pandas的偏爱。

为什么要用pandas来处理大量数据——而不是大数据?

大量数据和大数据之间有着明显的区别。随着围绕大数据的炒作,我们很容易将所有事情都视为大数据,顺其自然。

Dan Ariely教授有一个著名的笑话:

如何使用Pandas来处理大量数据但不是大数据

大量和大这两个词本身就是“相对的”,在我看来,大量就是小于100GB的数据集。

panda对于小数据(通常从100MB到1GB)非常有效,性能很少受到关注。

然而,如果你从事数据科学或大数据领域,那么在处理大型数据集时,你迟早会遇到一个常见的问题—性能低下和运行时间长,最终导致内存使用不足。

事实上,由于算法和本地内存的限制,pandas在大数据方面有自己的局限性。因此,大数据通常存储在计算集群中,具有更高的可伸缩性和容错性。并且经常可以通过大数据生态系统(AWS EC2、Hadoop等)使用Spark和许多其他工具来访问。

最后,一种在本地机器(具有一定的内存限制)上,用pandas来处理大量数据的方法是减少数据的内存使用。

如何在大量数据上使用Pandas?

如何使用Pandas来处理大量数据但不是大数据

所以问题是:如何使用pandas减少数据的内存使用?

下面的解释基于我的经验和一个匿名的大数据集(40 – 50gb),它要求我减少内存使用以适应本地内存进行分析(甚至在将数据集读入dataframe之前)。

1. 按块大小读取CSV文件

说实话,当时我遇到一个错误,我无法从CSV文件中读取数据,我感到很困惑,但时我发现我的本地机器的16GB RAM内存对于数据来说太小了。

然后好消息就来了:我意识到pandas.read_csv有一个名为chunksize的参数!

该参数本质上是指在任何时间为适应本地内存而读入dataframe的行数。由于数据由7000多万行组成,因此我将chunksize指定为每次100万行,每次100万行将大型数据集分解成许多小块。

# read the large csv file with specified chunksize 
df_chunk = pd.read_csv(r'../input/data.csv', chunksize=1000000)

按块大小读取CSV文件

上面的操作产生了一个用于迭代的TextFileReader对象。严格地说,df_chunk不是一个dataframe,而是一个用于下一步操作的对象。

一旦我准备好了对象,基本的工作流就是对每个块执行操作,并将它们连接起来,最后形成一个dataframe(如下所示)。通过迭代每个块,在将每个块添加到列表之前,我使用一个函数- chunk_preprocessing执行数据过滤/预处理。最后,我将这个列表连接到最终的dataframe中,以适应本地内存。

chunk_list = [] # append each chunk df here 
# Each chunk is in df format
for chunk in df_chunk: 
 # perform data filtering 
 chunk_filter = chunk_preprocessing(chunk)
 
 # Once the data filtering is done, append the chunk to list
 chunk_list.append(chunk_filter)
 
# concat the list into dataframe 
df_concat = pd.concat(chunk_list)

对每个块执行操作的工作流

2. 过滤掉不重要的列以节约内存

太好了。在这个阶段,我已经有了一个dataframe来执行所需的各种分析。

为了节省数据操作和计算的时间,我进一步过滤掉了一些不重要的列,以节省更多的内存。

# Filter out unimportant columns
df = df[['col_1','col_2', 'col_3', 'col_4', 'col_5', 'col_6','col_7', 'col_8', 'col_9', 'col_10']]

过滤掉不重要的列

3. 更改列的类型

将pandas数据列转换为另一种类型的最简单方法是使用 astype()。

我可以说,更改pandas中的数据类型对于节省内存非常有帮助,特别是如果你有大量数据用于高强度的分析或计算(例如,将数据输入你的机器学习模型中进行训练)。

通过减少存储数据所需的比特位,我将数据的总体内存使用量减少了50% !

试试吧。我相信你也会发现这很有用!让我知道进展如何。

# Change the dtypes (int64 -> int32)
df[['col_1','col_2', 
 'col_3', 'col_4', 'col_5']] = df[['col_1','col_2', 
 'col_3', 'col_4', 'col_5']].astype('int32')
# Change the dtypes (float64 -> float32)
df[['col_6', 'col_7',
 'col_8', 'col_9', 'col_10']] = df[['col_6', 'col_7',
 'col_8', 'col_9', 'col_10']].astype('float32')

更改数据类型节省内存

最后的想法

如何使用Pandas来处理大量数据但不是大数据

好了。感谢你的阅读。

我希望通过分享我在使用大数据时使用panda的经验,可以帮助你通过减少内存使用并最终提高计算效率来探索pandas处理大量数据的另一个有用特性。

通常,pandas具有我们需要进行数据处理和分析的大多数特性。我强烈建议你去看看它们,因为它们下次会对你有用的。

此外,如果你认真学习如何用Python进行数据分析,那么这本书是为你准备的—Python for Data Analysis。里面有在Python中使用pandas操作、处理、清理和处理数据集的完整说明,本书提供了一个全面和逐步的指南,有效地指导你在数据分析中使用pandas。

希望可以对你帮助!

英文原文:https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c

本文为专栏文章,来自:AI公园,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/76099.html 。

(0)
AI公园的头像AI公园专栏
上一篇 2019-09-23 18:43
下一篇 2019-10-13 20:12

相关文章

关注我们
关注我们
分享本页
返回顶部