Python:如何删除第二个DataFrame中与第一个指定列值重复的行
原有实现的问题点
- 嵌套循环通过
iterrows()拿到的row是行数据的浅副本,直接执行del row不会对原DataFrame产生任何修改,完全起不到删除行的作用 - 逐行遍历比对字符串的效率极低,当两个DataFrame数据量较大时运行速度会非常慢
- 循环过程中如果直接对原DataFrame做删除操作,会引发索引偏移、漏匹配的问题
高效正确的实现方式
优先使用pandas原生的向量化过滤逻辑,全程不需要写手动循环:
- 提取第一个DataFrame中所有需要排除的tif文件名,转成集合格式以提升查找效率:
exclude_tif_names = set(first_df['tif_pobrany']) - 对第二个DataFrame做行筛选,保留所有
nazwa_tifa不在排除集合内的行:# 取反isin判断,就是保留不在排除列表里的行 second_df_cleaned = second_df[~second_df['nazwa_tifa'].isin(exclude_tif_names)]
如果存在文件名前后带空格、大小写不一致导致匹配失效的情况,可以提前对两个列做字符串标准化处理:
# 统一去除前后空格、转小写,消除隐形格式差异带来的匹配错误 exclude_tif_names = set(first_df['tif_pobrany'].str.strip().str.lower()) second_df['nazwa_tifa'] = second_df['nazwa_tifa'].str.strip().str.lower() second_df_cleaned = second_df[~second_df['nazwa_tifa'].isin(exclude_tif_names)]
方案优势
- 运行效率远高于手动嵌套循环,pandas底层向量化操作的性能是纯Python循环的几十到上百倍
- 逻辑严谨,不会因为索引变动、副本引用问题出现删不干净的情况
- 代码简洁,后续维护成本低
如果确实需要用循环逻辑实现,也不要在迭代过程中直接修改原DataFrame,可以先收集所有需要排除的行索引,最后一次性执行删除操作,但这种写法依然远不如上面的向量化方案高效。
内容的提问来源于stack exchange,提问作者mapperguest
相关产品推荐
相关产品推荐

