2013-07-16 77 views
0

我讀一個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_c hunks_new),它似乎也改變了csv_chunks。任何想法可能會發生什麼?

感謝, 安妮

回答

1

csv_chunks是不是列表,它本身就是一個迭代器。通過循環遍歷所有迭代器已耗盡的元素。當您循環播放時,它不再返回元素再次pandas.concat()抱怨,因爲它傳遞了一個空序列。

只需重新創建對象:

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

它返回一個新鮮迭代器。

+0

非常感謝Martijn。只是爲了確保我理解這一點 - 何時正在讀取文件?在創建迭代器的時候,還是在迭代器被使用的時候? – Anne

+0

當使用迭代器時,*推測*;理論上可能的'pandas.read_csv()'打開文件,將所有數據讀入內存,然後在循環遍歷迭代器時生成數據,但這不太可能,效率也很低。 –

+0

@Anne:查看[源代碼](https://github.com/pydata/pandas/blob/master/pandas/io/parsers.py),看到你指定了塊大小,結論是文件正在讀取,因爲使用迭代器。 –