【发布时间】:2019-01-10 09:33:53
【问题描述】:
我有一个包含超过 400K 行和数百列的数据框,我决定用块读取它们,因为它不适合内存并给我 MemoryError。
我已经设法以这样的方式阅读它:
x = pd.read_csv('Training.csv', chunksize=10000)
然后我可以通过这样做得到每个块:
a = x.get_chunk()
b = x.get_chunk()
etc 等继续这样做超过 40 次,这显然是缓慢和糟糕的编程习惯。
当我尝试执行以下操作以尝试创建一个可以将每个块保存到数据帧中并以某种方式连接它们的循环时:
for x in pd.read_csv('Training.csv', chunksize=500):
x.get_chunk()
我明白了:
AttributeError: 'DataFrame' object has no attribute 'get_chunk'
在导入过程中读取文件并连接所有块的最简单方法是什么?
另外,我如何对我的数据集进行进一步操作以避免内存错误问题(特别是,输入空值、标准化/规范化数据帧,然后使用 scikit learn 在其上运行机器学习模型?
【问题讨论】:
-
pd.read_csv不返回可迭代对象,因此循环遍历它没有意义。我对pandas或块读取器方法知之甚少,但取决于get_chunk在您请求最后一个块之后的下一个块时所做的事情,您需要一个if或try/except语句来检查迭代是否应该停止。显然,如果您只是将所有块连接到一个大 DataFrame 中,您会遇到相同的内存问题。 chunk 方法适用于您对较小的块进行处理的情况,即块没有相互依赖关系。 -
x已经是DataFrame,因此您可以将其添加到列表中,然后在最后将它们全部连接起来。但是,如果您可以将整个文件放入内存中,因为您将在最后进行连接,所以不要分块读取它。这真的适用于当您无法将整个事物放入内存并需要一次处理单个部分时。 -
离题,太棒了,耶鲁大学物理学博士:)) 我无法将其放入记忆中,这就是我这样做的原因。我将如何按照您的建议进行操作?
-
只需删除
.get_chunk。在您的循环中,x是 5000 行的DataFrame,因此只需像处理更大的文件一样处理它。 -
在这种情况下,
data是DataFrames的列表,因此您需要执行df = pd.concat(data)以将列表加入单个DataFrame。
标签: python python-3.x pandas bigdata large-data