You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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遍历):

  1. 合并两个参考DataFrame的有效邮编,去重后转成集合:
import pandas as pd

# 合并并去重有效邮编,排除NaN
valid_postcodes = set(small_df['Postcode'].dropna()).union(set(large_df['Postcode'].dropna()))
  1. 筛选原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:35:59