Pandas DataFrame按条件删除行时循环无法结束的优化求助
Pandas DataFrame 行过滤效率问题解决方案
性能问题原因
你的代码耗时极长是两个错误操作导致的:
- 逐行遍历DataFrame索引取值,Pandas的Python层单元素循环访问性能极低
- 每次调用
df.drop都会生成全新的DataFrame副本,32万次重复拷贝的时间成本会指数级上涨,3小时跑不完是正常情况
优化后实现
全程使用向量化操作,32万行数据执行耗时不超过1秒:
import pandas as pd import numpy as np # 读取原始数据 df22 = pd.read_table('web-NotreDame.txt', header=None) # 生成10000个不重复的随机数 uniques = np.unique(np.random.randint(0, 10000, size=10000)) # 批量判断两列值是否都在目标集合内,一次性过滤 filter_mask = df22[0].isin(uniques) & df22[1].isin(uniques) df22 = df22[filter_mask].reset_index(drop=True)
优化逻辑说明
- 放弃Python层的逐行循环,用Pandas内置的
isin向量化方法做批量判断,执行逻辑是C语言级别,性能远高于Python循环 - 用布尔索引一次性过滤所有不符合要求的行,全程只有一次DataFrame拷贝,没有重复开销
- 不需要手动构造位向量,
isin内部已经做了高效的哈希查找,性能比自行维护列表位向量更高
注意事项
你原代码的判断逻辑存在错误:你写的判断条件是「两列都不在目标集合才删除」,但需求是「仅保留两列都在目标集合的行」,两者逻辑不一致,优化后的代码已经修正了该问题。
内容的提问来源于stack exchange,提问作者Alex97
相关产品推荐
相关产品推荐

