Pandas已经成为了最受数据科学领域欢迎的一个工具。它不仅使用简单、文档丰富,而且能力威力强大。然而,不管多少人使用Pandas,它在处理较大数据集的时候依然需要我们仔细把握。当我们的计算机RAM没办法在内存中存储所有的数据,我们就面临了硬件方面的障碍。一般大型企业存储的数据都会超过100G甚至1000G。即使你很有钱,去买了一个足够大内存的计算机,但是读取所有数据到内存中也是一个很慢的过程。
但Pandas又一次解决了我们的这个问题,这篇文章将教你3个技巧,帮助你在读取较大数据集的过程中,尽量节省内存和时间。我已经用这些方法,在我32G的计算机上读取了超过100G的数据量。
切分数据
因为易写和易度的原因,CSV格式存储数据非常方便,
pandas read_csv()可以用来读取CSV文件,但是,当我们的CSV文件非常大,以至于在读取会超出我们的内存,这个时候我们应该怎么办?Pandas为我们提供了一个简单易用的解决办法,我们用分块读取的方法代替一次性全部读取操作,每一块都是整个数据集的一部分,我们可以根据实际的业务需要来确定我们分块的大小,还要跟我我们计算机的RAM情况来具体操作。具体过程如下:
分块读取
分块处理
分块保存
重复1——3,直到获取所有分块结果
合并分块结果
我们可以使用read_csv中的chunksize参数,返回一个可迭代的对象,使用for循环做数据处理操作。如果我们的数据集非常复杂,具有非常多的维度,实际上在很多时候我们可以删除一些无关紧要的列,其次我们还可以删除很大一部分缺失值数据,进过这些操作之后我们的数据量就有了很大程度的减少,更加利于我们之后的操作。
代码如下:
df_chunks = pd.read_csv('C:/Users/5393/Desktop/fufei_test.csv', encoding='gb2312', chunksize=10)
chunks = []
for df_chunk in df_chunks:
df_chunk.drop(columns=['编号', '时间', '投注玩法', '比分'], axis=1, inplace=True)
# df_chunk = df_chunk.drop(columns=['编号'], axis=1, inplace=True)
chunks.append(df_chunk)
result = pd.concat(chunks)
result
删除数据
在我们刚刚拿到数据还没有做分析之前,我们可能已经知道了需要用到哪些数据,哪些数据对我们来说是没有意义的,例如姓名、编号等等,我们可以在读取数据的时候就跳过这些维度,这样我们可以节省很多的内存,pandas允许我们使用指定的列名。
比如说下面的数据集,我们只需要其中的三个字段:
usecols = ['日期', '状态', '联赛']
df_usecol = pd.read_csv('C:/Users/5393/Desktop/fufei_test.csv', encoding='gb2312', usecols=usecols)
df_usecol.head()
另外一种清除无效数据的方式是使用dropna()函数,这个函数可以删除含有空值的行或者列,在特定的情况下,这个函数可以提高数据准确性,同时也可以减少内存的消耗。
为每一列设置具体的数据格式
对于很多初级数据分析师来说,他们不会太关注数据类型,但是,一旦你开始结束较大的数据集,处理数据类型就会变得非常必要。
我们通常的做法是先读取CSV为DataFrame,然后再根据我们的需要改变列的数据类型,但是在大数据的处理过程中,必须要考虑到内存问题,在CSV中,浮点型的数据有时候会占据很大的内存,而浮点型的数据有时候也不是我们真正需要的。
例如,我们下载了一份数据集用来预测股票价格,然后我们使用了32位的浮点数来存储,但我们真的需要32位那么多吗?有时候16位对于我们来说就足够了,因为股票价格明确规定保留小数点后两位,所以我们要在pandas读取数据之前就设定合适的数据类型,而不是等数据全部读进去再进行修改。这样我们就不会占用超过实际需要的内存。
在read_csv函数中,可以通过使用dtype参数来实现这个功能,这个参数接受一个字典:
import pandas as pd
dtypes = {‘a’: np.float64, ‘b’: np.int32}
df = pd.read_csv('file.csv', dtype=dtypes)
以上就是我们在实际数据分析工作中的解决方法,希望可以帮助你节省时间和内存。