pandas无精确匹配DataFrame列的邻近值映射减法实现
问题原因
你写的代码有两个核心问题:
- 循环遍历
plusMinusOne[0]时,只要碰到第一个满足i+1或i-1在bias中的值就直接break退出,根本没完成全量数据的匹配逻辑 - 每次减法操作只覆盖了单一邻近匹配场景,没有把精确匹配、值+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
相关产品推荐
相关产品推荐

