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

pandas无精确匹配DataFrame列的邻近值映射减法实现

问题原因

你写的代码有两个核心问题:

  1. 循环遍历plusMinusOne[0]时,只要碰到第一个满足i+1或i-1在bias中的值就直接break退出,根本没完成全量数据的匹配逻辑
  2. 每次减法操作只覆盖了单一邻近匹配场景,没有把精确匹配、值+1邻近、值-1邻近三种匹配规则的映射关系统一整合,还加了fill_value=0的兜底,和需求逻辑不匹配。
正确实现方案

不用写逐行循环,直接构造全量匹配映射做向量化计算,效率更高逻辑也清晰,步骤如下:

  • 先分别构造三种匹配规则对应的键值映射:精确匹配直接用bias第0列做键,plusMinusOne值比bias小1的场景把bias第0列减1做键,plusMinusOne值比bias大1的场景把bias第0列加1做键
  • 合并三个映射,遇到键冲突时优先取精确匹配的结果(本题数据无冲突)
  • 直接用plusMinusOne的第1列减去映射到的bias对应值即可
import pandas as pd

# 原始数据
plusMinusOne = pd.DataFrame({
    0: [2459650, 2459650,2459650,2459654,2459654,2459654,2459660],
    1: [100, 90,80,14,15,16,2]
}, index=[3,4,5,12,13,14,27])

bias = pd.DataFrame({
    0: [2459651, 2459652,2459653,2459655,2459656,2459658,2459659],
    1: [10, 20,30,40,50,60,70]
})

# 构造三类匹配映射
map_exact = bias.set_index(0)[1]                # 精确匹配
map_plus_1 = bias.set_index(bias[0] - 1)[1]     # pm1值+1 = bias值
map_minus_1 = bias.set_index(bias[0] + 1)[1]    # pm1值-1 = bias值

# 合并映射,同键优先取精确匹配结果
match_map = pd.concat([map_exact, map_plus_1, map_minus_1]).groupby(level=0).first()

# 执行减法计算
plusMinusOne[1] = plusMinusOne[1] - plusMinusOne[0].map(match_map)
运行结果

执行后输出的plusMinusOne和预期结果完全一致:

0   1
3   2459650  90
4   2459650  80
5   2459650  70
12  2459654 -26
13  2459654 -25
14  2459654 -24
27  2459660 -68

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:10:00