如何在不连接的情况下读取 Python 数据框中的数据?

Posted

技术标签:

【中文标题】如何在不连接的情况下读取 Python 数据框中的数据?【英文标题】:How to read data in Python dataframe without concatenating? 【发布时间】:2017-01-16 02:55:44 【问题描述】:

我想将文件 f(文件大小:85GB)分块读取到数据帧中。建议使用以下代码。

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

但是,这段代码给了我 TextFileReader,而不是数据框。另外,由于内存限制,我不想连接这些块以将 TextFileReader 转换为数据帧。请指教。

【问题讨论】:

对不起,你在这里问什么?您无法将整个数据帧加载到内存中,这就是您读取块的原因,那么为什么您认为连接所有块可以解决这个问题? 将它们存储在列表中!??我没有得到你真正想要达到的目标。你想单独拥有这些块吗?请注意,您的 TextFileReader 是一个可迭代对象,您可以在其中通过 for chunk in TextFileReader 检索各个块 您可以使用 for 循环(块大小),在每次迭代中,您将为每个块获得一个数据帧。循环将运行五次,您可以在最后合并所有数据帧。 所以如上所述循环遍历TextFileReader 并处理任何你想要的块(减少它们,分组它们,......) 【参考方案1】:

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

有关生成器功能的更多信息: Reading a huge .csv file

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

用于处理较小的数据集:

方法一:直接将 reader 对象转换为 dataframe:

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

函数concat需要增加参数ignore index,避免索引重复。

方法二: 使用Iterator或get_chunk将其转化为dataframe。

通过为 read_csv 指定块大小,返回值将是 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 文件包含 100000 条记录,则 chunksize=5 将创建 20,000 个块。

【讨论】:

好的,但是您分享的屏幕截图显示它仍然会提供 TextFileReader。那么,我应该如何将其转换为 Dataframe? try chunk_1= pd.DataFrame(TextFileReader.get_chunk(1)) 这会将一个块转换为数据帧 我的数据有数百万行。所以,我不能使用第二种方法。并且,第一种方法具有串联。因此,由于我的 85GB csv 文件,我将达到内存限制。我该怎么办? 如果您可以将您的 csv 文件转换为 Python 支持的某种压缩文件格式。在这种情况下,读取数据会很容易。 检查接受的答案。 ***.com/questions/17444679/…【参考方案2】:

如果您想通过使用块来接收数据帧,您可以这样做。在初始化块迭代之前初始化空数据框。完成过滤过程后,您可以将每个结果连接到您的数据框中。结果,您将在 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])

【讨论】:

【参考方案3】:
  full_dataframe = pd.DataFrame(TextFileReader.get_chunk(100000))

【讨论】:

以上是关于如何在不连接的情况下读取 Python 数据框中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改特定列的情况下对数据框中的数据进行重新采样?

如何在不更改特定列的情况下对数据框中的数据进行重新采样?

在不计算的情况下获取 Spark 数据框中的行数

如何在不使用临时文件的情况下从 Java 中的嵌套 zip 文件中读取数据?

如何在不使用自动模型表单的情况下从 Django 的文本框中获取数据?

如何在不重写的情况下从数据框中删除行?