按顺序为各InputID匹配仅可分配一次的最小Dist_km对应TargetID
按优先级分配唯一最近TargetID的实现方案
实现逻辑
- 先将原始数据集按照
InputID升序、Dist_km升序排序,保证优先处理ID更小的Input,且每个Input的候选Target按距离从近到远排列 - 维护一个已占用TargetID的集合,用于快速校验Target是否已经被分配给更小的InputID
- 按顺序遍历每个InputID,依次检查它的候选Target,取第一个未被占用的Target完成分配,同时将该Target标记为已占用
你的场景中TargetID总数量为1435,大于InputID的945,不存在无可用Target分配的异常情况,无需额外兜底逻辑
可直接运行的Python实现(基于pandas)
基础版本:
import pandas as pd # 替换为你的原始数据文件路径,支持csv/xlsx等pandas可读取格式 df = pd.read_csv("distance_data.csv") # 按InputID升序、距离升序排序全表 df_sorted = df.sort_values(by=["InputID", "Dist_km"], ascending=[True, True]) used_targets = set() match_result = [] # 按顺序遍历所有InputID for input_id in df_sorted["InputID"].unique(): # 筛选当前InputID的所有候选Target current_candidates = df_sorted[df_sorted["InputID"] == input_id] for _, row in current_candidates.iterrows(): target = row["TargetID"] if target not in used_targets: # 匹配到最近可用Target,保存结果 match_result.append({ "InputID": input_id, "TargetID": target, "Dist_km": row["Dist_km"] }) used_targets.add(target) break # 导出匹配结果到文件 result_df = pd.DataFrame(match_result) result_df.to_csv("match_result.csv", index=False)
- 性能优化版本(适合百万级以上的大数据量场景):
import pandas as pd df = pd.read_csv("distance_data.csv") df_sorted = df.sort_values(by=["InputID", "Dist_km"], ascending=[True, True]) # 提前按InputID分组,避免重复过滤全表 input_groups = df_sorted.groupby("InputID") used_targets = set() match_result = [] for input_id, group in input_groups: for _, row in group.iterrows(): target = row["TargetID"] if target not in used_targets: match_result.append({ "InputID": input_id, "TargetID": target, "Dist_km": row["Dist_km"] }) used_targets.add(target) break result_df = pd.DataFrame(match_result) result_df.to_csv("match_result.csv", index=False)
内容的提问来源于stack exchange,提问作者Justina Vitkutė
相关产品推荐
相关产品推荐

