如何在Python数据框中读取数据而不进行连接?

11

我想要将大小为85GB的文件f,分块读入一个数据框中。以下代码是建议的。

chunksize = 5
TextFileReader = pd.read_csv(f, chunksize=chunksize)

然而,这段代码给我返回了TextFileReader而不是dataframe。另外,为了避免内存限制,我也不想连接这些块来将TextFileReader转换为dataframe。请给予建议。


1
抱歉,您在这里问什么?您无法将整个数据框加载到内存中,这就是为什么要分块读取,那么为什么您认为拼接所有块将解决此问题呢? - EdChum
将它们存储在列表中??我不明白你实际想要实现什么。你是想要将这些块分开吗?请注意,您的“TextFileReader”是一个可迭代对象,您可以通过“for chunk in TextFileReader”检索单个块。 - ChE
你可以使用for循环(chunksize),每次迭代都会得到一个数据块的数据框。循环将运行五次,最后你可以合并所有的数据框。 - Sayali Sonawane
1
所以按照上面所述的方法循环遍历TextFileReader,并对这些块进行任何您想要的操作(缩减、分组等)。 - ChE
3个回答

20

当您尝试处理 85GB 的 CSV 文件时,如果将其分成块并将其转换为数据框以读取所有数据,则肯定会超出内存限制。您可以尝试使用不同的方法来解决此问题。在这种情况下,您可以对数据进行过滤操作。例如,如果数据集中有 600 列,并且您只对其中的 50 列感兴趣,请尝试仅从文件中读取这 50 列。这样可以节省大量内存。边读行边处理。 如果需要先过滤数据,请使用生成器函数。yield使函数成为生成器函数,这意味着它在开始循环之前不会执行任何工作。

有关生成器函数的更多信息:

读取大型 .csv 文件

要进行高效的过滤,请参考:https://codereview.stackexchange.com/questions/88885/efficiently-filter-a-large-100gb-csv-file-v3

针对较小的数据集:

方法1:将reader对象直接转换为数据框:

full_data = pd.concat(TextFileReader, ignore_index=True)

为了避免索引重复,需要在concat函数中添加参数ignore index

方法二:使用迭代器或get_chunk将其转换为数据框(DataFrame)。

通过给read_csv指定一个chunksize参数,返回值将是一个类型为TextFileReader的可迭代对象。

df=TextFileReader.get_chunk(3)

for chunk in TextFileReader:
    print(chunk)

来源: http://pandas.pydata.org/pandas-docs/stable/io.html#io-chunking

df= pd.DataFrame(TextFileReader.get_chunk(1))

这将把一个数据块转换为数据框。

检查TextFileReader中的总数据块数

for chunk_number, chunk in enumerate(TextFileReader):
    # some code here, if needed
    pass

print("Total number of chunks is", chunk_number+1)

如果文件大小更大,我不建议采用第二种方法。例如,如果CSV文件包含100,000条记录,则chunksize=5将创建20,000个块。


好的,但是你分享的截图显示它仍然会给出TextFileReader。那么,我应该如何将其转换为Dataframe? - Geet
尝试使用pd.DataFrame(TextFileReader.get_chunk(1))将一个数据块转换为数据帧。 - Sayali Sonawane
1
我的数据有数百万行,所以我不能使用第二种方法。而且,第一种方法需要连接操作,因此由于我的85GB CSV文件,我将达到内存限制。我该怎么办? - Geet
如果您可以将CSV文件转换为Python支持的某种压缩文件格式,那么读取数据将变得更加容易。 - Sayali Sonawane
请查看被接受的答案。https://dev59.com/3GQm5IYBdhLWcg3wowWw - Sayali Sonawane

4
如果您想通过使用块处理来接收数据框作为结果,可以按照以下方式操作。在初始化块迭代之前,请初始化空数据框。完成过滤过程后,您可以将每个结果连接到您的数据框中。因此,在for循环下,您将获得根据条件过滤的数据框。
file = 'results.csv'
df_empty = pd.DataFrame()
with open(file) as fl:
    chunk_iter = pd.read_csv(fl, chunksize = 100000)
    for chunk in chunk_iter:
        chunk = chunk[chunk['column1'] > 180]
        df_empty = pd.concat([df_empty,chunk])

0
  full_dataframe = pd.DataFrame(TextFileReader.get_chunk(100000))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接