使用分块将 CSV 文件读入 Pandas 数据帧,生成单个目标数据帧

Posted

技术标签:

【中文标题】使用分块将 CSV 文件读入 Pandas 数据帧,生成单个目标数据帧【英文标题】:Read CSV File into Pandas Dataframe with Chunking Resulting in a Single Target Dataframe 【发布时间】:2021-04-17 22:20:14 【问题描述】:

我需要将 Pandas 中的 4GB 大文件作为 csv 读入数据帧。这是我当前的代码:

source_data_df = pd.read_csv(temp_file, skipinitialspace=True, dtype=str, na_values=['N.A.'])

由于内存不足错误而失败。

我知道我可以使用 chunksize Pandas 选项来降低内存利用率并在保存到磁盘之前以块的形式处理数据。在将其保存到磁盘之前,我无法弄清楚如何使用来自块中的 csv 文件的所有数据创建生成的单个数据帧。我需要帮助完成这段代码来创建这个最终的数据框。有人可以帮忙吗?

chunksize = 10000000
with pd.read_csv(temp_file, skipinitialspace=True, dtype=str, na_values=['N.A.'], chunksize=chunksize) as reader:
    for chunk in reader:
        process(chunk)

或者,可以将处理过的块附加到磁盘上的单个目标文件中吗?那么上面的代码会是什么样子呢?

另外,需要关于 3 GB 文件的最佳块大小的建议,块大小是否代表块的大小(以字节为单位)?比如说 500 MB 的块是什么意思?

chunksize 的度量单位是什么?我以为是字节,有人可以确认吗?

非常感谢!

【问题讨论】:

“在将其保存到磁盘之前,我无法弄清楚如何使用来自块的 csv 文件中的所有数据创建生成的单个数据帧。”所以你想在某个时候将整个数据帧放在内存中?这不会破坏分块加载它的目的吗?如果您没有足够的内存来一次加载所有数据,那么您将没有足够的内存来连接一个数据帧中的所有块。 我可以将处理过的块附加到磁盘上的单个目标文件中吗?上面的代码看起来如何?你能帮忙吗? 什么样的文件?您已经有一个 CSV 文件。 一个新的 CSV 文件。如果可以附加到新的镶木地板文件,那也很高兴! 【参考方案1】:

您可以使用以下方法读取块:

for df in pd.read_csv("path_to_file",  chunksize=chunksize):
  process(df)

块的大小与您的数据有关。例如,如果您的文件有 4GB 和 10 个样本(行),并且您将块大小定义为 5,则每个块将有 ~2GB 和 5 个样本。

您也可以分析文件格式,the parquet format has better compression power than CSV

【讨论】:

太棒了,那么从一个读取/分块的 4GB csv 文件(具有 100000 行)将块保存到单个 parquet 文件的实际代码是什么样的? 您可以将每个块导出到 parquet,df.to_parquet("path_to_file"),导出后,您将在文件之间进行合并。

以上是关于使用分块将 CSV 文件读入 Pandas 数据帧,生成单个目标数据帧的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 将 CSV 读入具有不同行长的数据帧

以内存有效的方式将大型 csv 读入稀疏的 pandas 数据帧

将 csv 文件作为浮点数读取到 pandas 数据帧

如何将带有文本信息的 1.3 GB csv 文件读入 Python 的 pandas 对象?

Pandas处理超大规模数据

将多个 CSV 文件读入单独的数据帧