首页 > 解决方案 > 解析两个大数据帧时出现内存错误

问题描述

我有两个数据帧,每个数据帧大约 400k 行,分别称为 a 和 b。我想要做的是为 df b 中的每一行找到数据框 a 中该行的帐号。如果存在,我想从数据框 a 中删除该行。问题是,当我尝试运行此代码时,我不断收到内存错误。最初我使用的是 iterrows,但是在处理大型数据集时这似乎很糟糕,所以我切换到应用,但我遇到了同样的错误。下面是我正在尝试的简化伪代码:

def reduceAccount(accountID):
    idx = frameA.loc[frameA["AccountID"] == accountID].index
    frameB.drop(idx, inplace=True)

frameB["AccountID"].apply(reduceAccount)

我什至尝试过一些恶作剧,比如遍历前几十/千行,但是在一个循环之后,我仍然遇到内存错误,这让我觉得我仍然将东西加载到内存中而不是通过清除。有没有比我尝试的更好的方法来减少 dataframeA?请注意,我不想合并帧(但)只是删除数据帧 a 中在数据帧 b 中有重复键的任何行。

标签: pythonpandas

解决方案


问题是,为了查看要过滤的所有值,您需要在某个时候将两个 DF 存储在内存中。你可以通过不使用来提高你的效率apply(),它仍然是一个迭代器。以下代码是直接使用布尔掩码的更有效的矢量化方法。

dfB[~dfB["AccountID"].isin(dfA["AccountID"])]

但是,如果存储是问题,那么这可能仍然行不通。一些要考虑的方法是对数据进行分块,正如你所说你已经尝试过,或者文档中关于提高性能的一些选项


推荐阅读