【问题标题】:Using pandas to efficiently read in a large CSV file without crashing使用 pandas 高效读取大型 CSV 文件而不会崩溃
【发布时间】: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()

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

【问题讨论】:

    标签: python pandas csv dataframe jupyter-notebook


    【解决方案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 我建议您参考:stackoverflow.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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-29
      • 2020-06-29
      • 2014-11-15
      • 2023-02-20
      相关资源
      最近更新 更多