【问题标题】:Read CSV File into Pandas Dataframe with Chunking Resulting in a Single Target Dataframe使用分块将 CSV 文件读入 Pandas 数据帧,生成单个目标数据帧
【发布时间】: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 文件。如果可以附加到新的镶木地板文件,那也很高兴!

标签: python python-3.x pandas dataframe


【解决方案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"),导出后,您将在文件之间进行合并。
猜你喜欢
  • 1970-01-01
  • 2019-11-23
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
相关资源
最近更新 更多