本期编辑:1+1=6

本期作者:Admond Lee

Pandas的功能构建在Numpy之上。这意味着Pandas在很大程度上依赖于Numpy来实现它的对象来进行操作和计算,但是使用起来会更加方便。

在实际应用中,Numpy和Pandas可以互换使用。

为什么要用Pandas处理 Large Data,而不是 Big Data?

Large Data 和 Big Data之间有着明显的区别。随着对Big Data热度提升,我们很容易将一切都视为Big Data。

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

Large和Big这个词本身就是“相对的”,在我们看来,Large data就是小于100GB的数据。

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

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

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

最终,在本地计算机上使用Pandas和Large data(具有一定的内存限制)的方法之一是减少数据的内存使用。

如何使用Pandas处理Large data

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

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

1、以chunksize读取CSV文件数据

当遇到无法从CSV文件中读取数据时,我们感到十分困惑,但发现我们本地机器的内存对于16GB的数据来说太小了。

但我们意识到: pandas.read_csv 有一个名为 chunksize 的参数!

该参数本质上是指在任何时候为适应本地内存而读入dataframe的行数。由于数据由7000多万行组成,因此我们将 large data的 chunksize指定为每次100万行。

df_chunk = pd.read_csv( r'../input/data.csv' , chunksize= 1000000 )

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

准备好对象后,基本的工作流就是对每个chunk执行操作,并将它们连接起来,最后形成一个dataframe如下所示。通过迭代每个chunk,在将每个chunk添加到列表之前,使用一个函数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. 过滤掉不重要的columns以节省内存

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

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

d f = df[[ 'col_1' , 'col_2' , 'col_3' , 'col_4' , 'col_5' , 'col_6' , 'col_7' , 'col_8' , 'col_9' , 'col_10' ]]

3、更改columns的dtypes

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

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

通过减少存储数据所需的bits,我们将数据的总体内存使用量 减少了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' )

赶快动手试试吧!

https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c 返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。