使用 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 标题行而不读取/重写整个文件