Python:验证DataFrame中邮编是否存在于另外两个DataFrame时代码异常
找出不在参考列表中的苏格兰邮编
原代码问题分析
你写的循环逻辑有误:if i not in small_df['Postcode'] or large_df['Postcode'] 中,large_df['Postcode']作为布尔判断时,只要这个Series非空就会返回True,导致整个条件永远成立,所以所有邮编都会被输出。正确逻辑应该是邮编既不在small_df也不在large_df中,需要用and替代or,同时还要注意NaN的处理,以及提升查找效率。
高效解决方案(推荐)
利用Pandas的向量操作+集合查找(集合查找效率远高于Series遍历):
- 合并两个参考DataFrame的有效邮编,去重后转成集合:
import pandas as pd # 合并并去重有效邮编,排除NaN valid_postcodes = set(small_df['Postcode'].dropna()).union(set(large_df['Postcode'].dropna()))
- 筛选原DataFrame中不在有效集合里的邮编:
# 保留所有不匹配的条目(包括NaN) mismatched_postcodes = df[~df['Postcode'].isin(valid_postcodes)] # 或者排除NaN,只输出非空的不匹配邮编 mismatched_postcodes = df[(~df['Postcode'].isin(valid_postcodes)) & df['Postcode'].notna()] # 查看结果 print(mismatched_postcodes['Postcode'])
修正循环写法(不推荐大数据量使用)
如果一定要用循环,修正逻辑并优化查找效率:
valid_postcodes = set(small_df['Postcode'].dropna()).union(set(large_df['Postcode'].dropna())) for postcode in df['Postcode']: # 跳过NaN(如果不需要输出NaN的话) if pd.isna(postcode): continue # 检查是否不在有效集合中 if postcode not in valid_postcodes: print(postcode)
关键说明
- 用集合存储有效邮编:避免每次查找都遍历整个Series,大幅提升速度,尤其是数据量较大时。
- 处理
NaN:原数据中的NaN不属于任何有效邮编,可根据需求选择是否保留输出。
内容的提问来源于stack exchange,提问作者Ross Clark
相关产品推荐
相关产品推荐

