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

Python中如何仅当id_number列非空时执行pandas匹配脚本?

原脚本失效的核心原因
  • 判断条件恒为真:if df1[['id_number']] is not NaN 的判断结果永远是True。is/is not 用来判断两个Python对象的内存地址是否一致,这里对比的一个是单列组成的DataFrame对象,一个是浮点型的NaN常量,二者不可能指向同一块内存,所以这个判断根本起不到空值校验的作用。
  • 空值判断逻辑不符合pandas的规则:整列的空值校验不能用单值和列做等值判断,需要调用pandas内置的空值检测方法逐元素比对。
修正后的可运行代码

根据需求——id_number列无有效非空值时输出提示,有有效非空值时执行模糊匹配,调整后的代码如下:

import pandas as pd
from fuzzywuzzy import fuzz

# 直接传入文件路径即可读取,无需手动open句柄,避免文件占用
df1 = pd.read_excel('input.xlsx', sheet_name='sheet1')
df2 = pd.read_excel('input.xlsx', sheet_name='sheet2')

id_series = df1['id_number']
# 判断整列是否全部为空值
if id_series.isna().all():
    print("Sheet1的id_number列无有效非空值,不执行后续模糊匹配逻辑")
else:
    # 先过滤掉id_number为空的行,避免空值参与计算触发报错
    valid_id_part = df1[df1['id_number'].notna()][['id_number']]
    # 交叉匹配计算相似度
    cross_result = valid_id_part.merge(df2[['identity_no']], how='cross')
    cross_result['match_acc'] = cross_result.apply(
        lambda row: fuzz.ratio(row['id_number'], row['identity_no']),
        axis=1
    )
    # 取每个id的最高匹配得分,映射回原表
    id_max_score = cross_result.groupby('id_number')['match_acc'].max()
    df1['match_acc'] = df1['id_number'].map(id_max_score)
可调整的校验规则

如果你的实际需求是只要id_number列存在任意一个空值,就不执行匹配,可以把判断条件替换为if id_series.isna().any():,对应的逻辑是列中只要有1个空值就输出提示,全列无空值时才运行匹配流程。

内容的提问来源于stack exchange,提问作者Manz。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 17:36:00