本期编辑: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
返回搜狐,查看更多
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。