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

Python如何基于id_number列非空条件执行Pandas匹配脚本

按条件触发的模糊关联匹配实现

核心实现逻辑

逐行判断Sheet1的id_number单元格状态:

  • 单元格非空时,执行和Sheet2所有有效identity_no的模糊匹配,计算最高匹配度写入match_acc列
  • 单元格为空时,直接返回提示文本,不触发匹配计算

原脚本无法运行的问题修正点

  • 空值判断方式错误:pandas中无法通过is关键字对比NaN判断空值,需使用内置的pd.isna()/pd.notna()方法
  • 空值比对对象错误:原逻辑把pandas的缺失值和字符串'NaN'做比对,无法识别真实的空单元格
  • 重复合并计算冗余:原逻辑每次计算匹配时都重新做全表cross merge,可提前提取Sheet2的有效ID列表,减少重复计算
  • 字符串格式问题:测试数据中存在列值前后带空格的情况,读取Excel时统一做trim处理,避免匹配偏差

完整可运行代码

import pandas as pd
from fuzzywuzzy import fuzz

# 读取数据并统一去除字符串前后空格
df1 = pd.read_excel('input.xlsx', sheet_name='sheet1').apply(
    lambda col: col.str.strip() if col.dtype == 'object' else col
)
df2 = pd.read_excel('input.xlsx', sheet_name='sheet2').apply(
    lambda col: col.str.strip() if col.dtype == 'object' else col
)

# 提前提取Sheet2所有非空的identity_no,避免重复遍历计算
s2_valid_ids = df2['identity_no'].dropna().unique().tolist()

def get_match_result(current_id):
    # 空值判断:对应单元格为空时返回提示
    if pd.isna(current_id):
        return "id_number为空,跳过匹配流程"
    # 非空时计算最高模糊匹配度
    return max([fuzz.ratio(current_id, s2_id) for s2_id in s2_valid_ids])

# 逐行写入匹配结果
df1['match_acc'] = df1['id_number'].apply(get_match_result)

# 导出最终结果
df1.to_excel('output_result.xlsx', index=False)

测试数据运行预期效果

基于给出的测试数据,运行后match_acc列的对应值为:

  • 带IN2231D值的行:和Sheet2对应ID的匹配度约92
  • 带UK654IN值的行:和Sheet2对应ID的匹配度为100
  • id_number为空的行:返回提示文本“id_number为空,跳过匹配流程”
  • 带LK0678G值的行:和Sheet2对应ID的匹配度为100
  • 带NG5678J值的行:计算得到的最高模糊匹配度为0

可在匹配函数内增加匹配度阈值判断,低于阈值时返回自定义提示信息,适配更灵活的业务规则。


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

相关产品推荐
方舟 Agent Plan

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

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