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

Python实现表间MTM_VALUE最小绝对差唯一匹配及DataFrame输出

一对一最小绝对差匹配实现方案

原代码存在的问题

  • 内层循环完全冗余,未针对单个x计算对应差值
  • 错误使用整个Series(A['MTM_VALUE'])替代当前迭代的单个值x
  • 直接对pandas Series调用remove方法会报错(Series不支持该操作)
  • min_diff计算逻辑错误,未关联当前x与匹配到的目标值

基础实现(小数据量适用)

将B的数值转为列表操作,避免修改原始数据,遍历A的每个值匹配最优B值:

import pandas as pd

# 假设A、B为输入的pandas DataFrame
# 复制B的MTM_VALUE到临时列表,保护原始数据
available_b_values = B['MTM_VALUE'].tolist()
match_records = []

for a_val in A['MTM_VALUE']:
    if not available_b_values:
        # B值耗尽,记录无匹配结果
        match_records.append({
            'A_MTM_VALUE': a_val,
            'B_MTM_VALUE': None,
            'min_abs_diff': None
        })
        continue
    
    # 找到当前A值对应的最小绝对差B值
    closest_b = min(available_b_values, key=lambda b_val: abs(a_val - b_val))
    current_diff = abs(a_val - closest_b)
    
    # 移除已匹配的B值,避免重复使用
    available_b_values.remove(closest_b)
    
    # 记录匹配结果
    match_records.append({
        'A_MTM_VALUE': a_val,
        'B_MTM_VALUE': closest_b,
        'min_abs_diff': current_diff
    })

# 转换为结果DataFrame
result_df = pd.DataFrame(match_records)

高效实现(大数据量适用)

通过排序+双指针贪心匹配,降低时间复杂度(从O(n*m)优化到O(n log n + m log m)):

import pandas as pd

# 对A、B的MTM_VALUE排序,保留原始数据索引
sorted_a = A['MTM_VALUE'].sort_values().reset_index(drop=True)
sorted_b = B['MTM_VALUE'].sort_values().reset_index(drop=True)

a_ptr = 0
b_ptr = 0
match_map = {}

# 双指针遍历匹配最优值
while a_ptr < len(sorted_a) and b_ptr < len(sorted_b):
    current_a = sorted_a.iloc[a_ptr]
    current_b = sorted_b.iloc[b_ptr]
    current_diff = abs(current_a - current_b)
    
    # 检查下一个B值是否更优
    if b_ptr + 1 < len(sorted_b):
        next_diff = abs(current_a - sorted_b.iloc[b_ptr+1])
        if next_diff < current_diff:
            b_ptr += 1
            continue
    
    # 记录匹配关系
    match_map[current_a] = (current_b, current_diff)
    a_ptr += 1
    b_ptr += 1

# 处理A中未匹配的剩余值
while a_ptr < len(sorted_a):
    current_a = sorted_a.iloc[a_ptr]
    match_map[current_a] = (None, None)
    a_ptr += 1

# 映射回原始A的顺序,生成结果DataFrame
result_df = A.copy()
result_df['B_MTM_VALUE'] = result_df['MTM_VALUE'].apply(lambda x: match_map[x][0])
result_df['min_abs_diff'] = result_df['MTM_VALUE'].apply(lambda x: match_map[x][1])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:40:57