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。
相关产品推荐
相关产品推荐

