基于Numpy优化DataFrame间值存在性检查的高效方案
优化大DataFrame下FLAG_NEW字段的生成效率
原代码运行缓慢的核心问题:
- 依赖
iterrows()逐行遍历,属于Python层面的循环,远不及Pandas向量化操作的执行效率 - 每次循环重复调用
historized.ID.to_list()生成列表,且列表的in查询是O(n)复杂度,数据量越大越耗时
最优优化方案(向量化+集合查询)
直接用Pandas的isin()向量化方法,搭配集合提升查询效率:
# 将historized的ID转为集合(集合成员查询是O(1),比列表快几个数量级) historized_id_set = set(historized["ID"]) # 方法1:布尔值转整数(~取反,不在集合内的为True,转int后对应1) gdf_pot["FLAG_NEW"] = (~gdf_pot["ID"].isin(historized_id_set)).astype(int) # 方法2:用np.where实现逻辑映射 import numpy as np gdf_pot["FLAG_NEW"] = np.where(gdf_pot["ID"].isin(historized_id_set), 0, 1)
方案高效的原因
isin()是Pandas底层实现的向量化操作,基于C语言处理数据,比Python逐行循环快几十到几百倍- 集合的查询复杂度远低于列表,数据量越大,这个优化的效果越显著
你之前用np.where失败的可能原因
大概率是没把historized.ID转为集合,或者错误地在逐行循环中使用np.where——正确用法是直接对整个ID列做向量化判断,而非逐行处理。
内容的提问来源于stack exchange,提问作者CodeoDE
相关产品推荐
相关产品推荐

