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
相关产品推荐
相关产品推荐

