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

4
我正在尝试从http://grouplens.org/datasets/movielens/20m/读取名为 ratings.csv 的 .csv 文件,该文件在我的计算机上大小为 533.4MB。
以下是我在 jupyter 笔记本中编写的内容。
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()

只有最后一块被写入,其他都被注销了。
2个回答

16

当读取数据框时,建议在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。请再试一次。 - cs95
你能帮忙修改一下吗?虽然速度很快,但每次写入数据时我都失败了。@cOLDsLEEP - Developer
仍然存在一个问题,现在它仅采用第一个块,其他块未被记录,有20M数据但该方法仅保留20K数据,仅适用于第一个块@cOLDsLEEP。 - Developer
@开发者 我建议您参考这个链接:https://dev59.com/jlwX5IYBdhLWcg3wlgTl - cs95
同时,https://dev59.com/J18e5IYBdhLWcg3wNYUn - cs95

0
尝试这样做 - 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接