我有两个大约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中具有重复键的任何行。
答案 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')
我认为这对内存效率来说是最好的,因为您将利用熊猫内置的优化代码的力量。