使用 pandas 高效读取大型 CSV 文件而不会崩溃

Posted

技术标签:

【中文标题】使用 pandas 高效读取大型 CSV 文件而不会崩溃【英文标题】:Using pandas to efficiently read in a large CSV file without crashing 【发布时间】:2018-02-02 20:15:30 【问题描述】:

我正在尝试从http://grouplens.org/datasets/movielens/20m/ 读取名为 rating.csv 的 .csv 文件,该文件在我的计算机中为 533.4MB。

这就是我在 jupyter notebook 上写的内容

import pandas as pd
ratings = pd.read_cv('./movielens/ratings.csv', sep=',')

这里的问题是内核会中断或死亡并要求我重新启动并且它不断重复相同。没有任何错误。请您提出解决此问题的任何替代方法,就好像我的计算机无法运行它一样。

这可行,但它会不断重写

chunksize = 20000
for ratings in pd.read_csv('./movielens/ratings.csv', chunksize=chunksize):
ratings.append(ratings)
ratings.head()

只写入最后一个块,其他块被注销

【问题讨论】:

【参考方案1】:

在读取数据帧时,您应该考虑在read_csv 中使用chunksize 参数,因为它返回一个TextFileReader 对象,然后您可以将其传递给pd.concat 以连接您的块。

chunksize = 100000
tfr = pd.read_csv('./movielens/ratings.csv', chunksize=chunksize, iterator=True)
df = pd.concat(tfr, ignore_index=True)

如果您只想单独处理每个块,请使用,

chunksize = 20000
for chunk in pd.read_csv('./movielens/ratings.csv', 
                         chunksize=chunksize, 
                         iterator=True):
    do_something_with_chunk(chunk)

【讨论】:

我已经尝试过了,虽然它没有崩溃,但内核运行了 40 多分钟而没有终止......我只是取消了它。读取 20M 条记录需要多长时间? @Developer 增加块大小并设置 iterator=True。再试一次。 您能否协助编辑。它很快,但每次写入时我都未能追加数据@cOLDsLEEP 现在还有一个问题,它只取第一个块,其他块不记录,有20M数据但该方法只会保留20K数据,只保留第一个块@cOLDsLEEP @Developer 我建议您参考:***.com/questions/33642951/…【参考方案2】:

像这样尝试 - 1) 使用 dask 加载,然后 2) 转换为 pandas

import pandas as pd
import dask.dataframe as dd
import time
t=time.clock()
df_train = dd.read_csv('../data/train.csv')
df_train=df_train.compute()
print("load train: " , time.clock()-t)

【讨论】:

以上是关于使用 pandas 高效读取大型 CSV 文件而不会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas - 编写新的 CSV 标题行而不读取/重写整个文件

使用pandas处理大型CSV文件

如何读取非常大的 CSV 的一小部分行。 Pandas - 时间序列 - 大型数据集

使用 Pandas 读取大型文本文件 [重复]

高效地将大型 Pandas 数据帧读取到磁盘

使用块读取大型csv文件时如何在连接块之前处理除一列之外的所有列