python - 解析两个大数据帧时出现内存错误
问题描述
我有两个数据帧,每个数据帧大约 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 中有重复键的任何行。
解决方案
问题是,为了查看要过滤的所有值,您需要在某个时候将两个 DF 存储在内存中。你可以通过不使用来提高你的效率apply()
,它仍然是一个迭代器。以下代码是直接使用布尔掩码的更有效的矢量化方法。
dfB[~dfB["AccountID"].isin(dfA["AccountID"])]
但是,如果存储是问题,那么这可能仍然行不通。一些要考虑的方法是对数据进行分块,正如你所说你已经尝试过,或者文档中关于提高性能的一些选项
推荐阅读
- c - 查找进程(task_struct)的最老的孩子(不是兄弟姐妹)
- language-agnostic - 任何数字乘以零等于零,但为什么零的阶乘数等于 1?
- python - 如何使用设置为 IconMode 的 QListView 和设置为 QFileSystemModel 的模型来换行项目文本
- cert-manager - 是否可以仅使用 cert-manager 获取 CA pub 密钥?
- go - os.StartProcess() 不允许在 golang 中使用 sudo 命令
- c# - Nethereum.JsonRpc.Client.RpcResponseException: 错误: 交易恢复没有原因字符串: eth_sendRawTransaction
- java - Sonarqube 关键问题“定义并抛出专用异常而不是使用通用异常”
- asp.net - 如何使用 VB、Asp 和 ORACLE 使用两个文本框和一个按钮刷新我的 GridView
- javascript - 尝试使用 WordPress 的 fusion builder 创建自定义表单,在输入进入 DOM 之前触发事件
- r - 如何使列中的下一个数字成为r中的序列