如何优化30000行DataFrame中重复邮箱检测的嵌套循环?
优化方案:用Pandas向量化操作替代双重循环
你的代码卡顿核心原因是双重循环的O(n²)时间复杂度,3万行数据会产生9亿次循环操作,完全没必要——Pandas内置了高效的重复值检测方法,直接用向量化操作就能搞定,性能提升几个数量级。
优化后的代码
import pandas as pd data={'Name':['Danny','Damny','Monny','Quony','Dimny','Danny'], 'Email':['danny@gmail.com','danny@gmail.com','monny@gmail.com','quony@gmail.com','danny@gmail.com','danny@gmail.com']} df = pd.DataFrame(data) # 标记所有重复的邮箱行 df['email_repeated'] = df['Email'].duplicated(keep=False).map({True: 'ja', False: None})
代码说明
df['Email'].duplicated(keep=False):返回一个布尔数组,所有重复出现的邮箱(包括第一次出现的)都会标记为True,刚好匹配你要标记所有重复行的需求。.map({True: 'ja', False: None}):把布尔值转换成你需要的'ja'或空值,完成列值的批量赋值。- 整个过程是Pandas的向量化操作,底层基于C实现,不需要Python层面的循环,处理3万行数据几乎瞬间完成。
原代码效率低的原因
- 双重循环:3万行数据需要执行9亿次循环,Python本身循环性能弱,这种量级完全扛不住。
- 链式索引修改:
df['email_repeated'][k]的写法会触发Pandas的SettingWithCopyWarning,且每次单独修改行值没有利用批量处理的优势,进一步拖慢速度。
内容的提问来源于stack exchange,提问作者Rohit Nirmal
相关产品推荐
相关产品推荐

