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

Pandas .loc搭配isin筛选浮点数时无法匹配全部存在的目标值

问题根因

匹配失效由浮点数精度误差导致。从PDF解析得到的存入DataFrame的16.9并非严格精确值,受浮点数二进制存储规则、PDF文本提取的数值解析精度影响,该位置实际存储值通常为类似16.899999999999985或16.900000000000002的近似值,和list_difference中硬编码的16.9内存值不完全相等。isin默认做严格等值匹配,因此会漏掉该行。

可执行以下代码验证实际存储值:

# 打印16.9对应行的Value真实存储值
print(repr(df_bank.loc[2, 'Value']))
修复方案

浮点数场景禁止直接做精确等值匹配,改用带容差的匹配逻辑,两种常用方案适配发票金额比对场景:

前置兜底操作:匹配前建议先对Value列做类型转换,PDF提取过程中可能混入字符串格式的数值、带特殊符号的异常值,统一转成float类型可避免类型不匹配导致的匹配失效:

import pandas as pd
df_bank['Value'] = pd.to_numeric(df_bank['Value'], errors='coerce')
  • 方案1:基于容差阈值做近邻匹配,适配所有浮点数比对场景。金额类场景设置1e-6的绝对误差即可覆盖绝大多数PDF提取带来的精度问题
import numpy as np
# 对Value列和待匹配列表做批量近邻判断,任意一个待匹配值和当前行值误差小于阈值即判定为命中
match_mask = np.isclose(df_bank['Value'].to_numpy()[:, None], list_difference, atol=1e-6).any(axis=1)
difference = df_bank.loc[match_mask]
  • 方案2:统一精度后做精确匹配,逻辑更直观易维护。如果业务规则明确要求金额最多保留2位小数,可先将数值统一四舍五入到2位小数再调用isin匹配
difference = df_bank.loc[df_bank['Value'].round(2).isin(list_difference)]

内容的提问来源于stack exchange,提问作者João Pedro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:09:22