【问题标题】:list iteration changes original list to None列表迭代将原始列表更改为无
【发布时间】:2013-07-16 12:54:27
【问题描述】:

我正在读取一个 csv 文件,然后进行一些过滤:

csv_chunks = pandas.read_csv(filepath, sep = DELIMITER,skiprows = 2, chunksize = 1000, converters = {"A": str, "B": str})

csv_chunks_new = [chunk[(chunk["A"] + chunk["B"]).isin(acids.tolist())]
          for chunk in csv_chunks]

奇怪的是,当我现在尝试将 csv_chunks 转换为数据框时

df = pandas.concat(chunk for chunk in csv_chunks)

我收到以下错误:

Exception: All objects passed were None

因此,尽管我将过滤后的结果重新分配给一个新对象 (csv_chunks_new),但它似乎也改变了 csv_chunks。任何想法可能会发生什么?

谢谢, 安妮

【问题讨论】:

    标签: python csv file-io pandas


    【解决方案1】:

    csv_chunks 不是一个列表,它本身就是一个迭代器。通过循环遍历所有元素,您已经用尽了该迭代器。当你再次循环它时它不再返回元素,并且pandas.concat()抱怨因为它传递了一个空序列。

    只需重新创建对象:

    csv_chunks = pandas.read_csv(filepath, sep = DELIMITER,skiprows = 2, chunksize = 1000, converters = {"A": str, "B": str})
    

    返回一个新的迭代器。

    【讨论】:

    • 非常感谢 Martijn。只是为了确保我理解这一点 - 什么时候读取文件?在我创建迭代器时,还是在使用迭代器时?
    • 使用迭代器时,大概;从理论上讲,pandas.read_csv() 可以打开文件,将所有数据读入内存,然后在遍历迭代器时生成该数据,但这不太可能而且效率非常低。
    • @Anne:查看source code,看到你指定了一个块大小,结论是在使用迭代器时正在读取文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2016-03-16
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多