使用分块将 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 数据帧,生成单个目标数据帧的主要内容,如果未能解决你的问题,请参考以下文章
以内存有效的方式将大型 csv 读入稀疏的 pandas 数据帧