解析两个大数据帧时出现内存错误

时间:2019-02-26 18:25:17

标签: python pandas

我有两个大约40万行的数据帧,分别称为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)

我什至尝试了一些shennanigans,例如遍历前几百/千行,但是经过一个周期后,我仍然遇到内存错误,这使我认为我仍然将内容加载到内存中而不是通过内存清除。是否有比我正在尝试的减少dataframeA更好的方法?请注意,我不想合并框架(但)只是删除数据框架a中在数据框架b中具有重复键的任何行。

2 个答案:

答案 0 :(得分:2)

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

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

但是,如果存储出现问题,则可能仍然无法正常工作。您可以考虑使用某些方法对数据进行分块处理,或者enhancing performance

中的文档中的某些选项

答案 1 :(得分:0)

因此,基本上,您希望A中“ AccountID”不在B中的每一行。

这可以通过左联接来完成:frameA = frameA.join(frameB, on='AccountID', how='left')

我认为这对内存效率来说是最好的,因为您将利用熊猫内置的优化代码的力量。