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

如何为各distances_列获取最小值索引且避免重复选取

问题描述

给定如下Pandas DataFrame:

import pandas as pd
df = pd.DataFrame({
    'index': {0: 'x0', 1: 'x1', 2: 'x2', 3: 'x3', 4: 'x4', 5: 'x5', 6: 'x6', 7: 'x7', 8: 'x8', 9: 'x9', 10: 'x10'},
    'distances_0': {0: 0.42394711275317537, 1: 0.40400179114038315, 2: 0.4077213959237454, 3: 0.3921048592156785, 4: 0.25293154279281627, 5: 0.2985576890173001, 6: 0.0, 7: 0.32563550923886675, 8: 0.33341592647322754, 9: 0.30653189426783256, 10: 0.31749957588191197},
    'distances_1': {0: 0.06684300576184829, 1: 0.04524728117549289, 2: 0.04896118088709522, 3: 0.03557204741075342, 4: 0.10588973399963886, 5: 0.06178330590643222, 6: 0.0001, 7: 0.6821440376099591, 8: 0.027074111335967314, 9: 0.6638424898747833, 10: 0.674718181953208},
    'distances_2': {0: 0.7373816871931514, 1: 0.7184619375104593, 2: 0.7225072199147892, 3: 0.7075191710741303, 4: 0.5679436864793461, 5: 0.6142446533143044, 6: 0.31652743219529056, 7: 0.010859948083988706, 8: 0.6475070638933254, 9: 0.010567926115431175, 10: 0.0027932480510772413}
})

表格展示形式:

index   distances_0 distances_1 distances_2
0   x0  0.423947    0.066843    0.737382
1   x1  0.404002    0.045247    0.718462
2   x2  0.407721    0.048961    0.722507
3   x3  0.392105    0.035572    0.707519
4   x4  0.252932    0.105890    0.567944
5   x5  0.298558    0.061783    0.614245
6   x6  0.000000    0.000100    0.316527
7   x7  0.325636    0.682144    0.010860
8   x8  0.333416    0.027074    0.647507
9   x9  0.306532    0.663842    0.010568
10  x10 0.317500    0.674718    0.002793

需求:为每个distances_*列找到对应最小值的index,要求每个index只能被分配给一个列。若某index同时是多个列的最小值,优先分配给该index对应数值更小的列(例如x6是distances_0和distances_1的最小值,但0.0 < 0.0001,所以x6优先分配给distances_0)。

解决方案

核心逻辑是优先处理数值最小的条目,确保最优的index先被分配给对应列,避免被其他数值更大的列占用。具体实现步骤如下:

  1. 将index列设为DataFrame的索引,方便后续操作:
df = df.set_index('index')
  1. 收集所有distances_*列的最小值信息,包括列名、对应index、最小值:
min_info = []
for col in df.columns:
    min_val = df[col].min()
    min_idx = df[col].idxmin()
    min_info.append({'col': col, 'index': min_idx, 'value': min_val})
  1. 按最小值从小到大排序,确保数值最小的条目优先处理:
min_info_sorted = sorted(min_info, key=lambda x: x['value'])
  1. 遍历排序后的条目,分配唯一index:
used_indices = set()
result = {}

for item in min_info_sorted:
    if item['index'] not in used_indices:
        # 该index未被使用,直接分配给当前列
        result[item['col']] = item['index']
        used_indices.add(item['index'])
    else:
        # 该index已被占用,在当前列中排除已用index,找剩余最小值对应的index
        filtered_df = df[~df.index.isin(used_indices)]
        new_min_idx = filtered_df[item['col']].idxmin()
        result[item['col']] = new_min_idx
        used_indices.add(new_min_idx)
  1. (可选)将结果整理为DataFrame,方便查看:
result_df = pd.DataFrame.from_dict(result, orient='index', columns=['最优index'])
print(result_df)

结果验证

运行上述代码后,最终结果为:

最优index
distances_0      x6
distances_2     x10
distances_1      x8

完全符合需求:

  • distances_0获得x6(最小值0.0)
  • distances_2获得x10(最小值0.002793)
  • distances_1因x6已被占用,选择剩余最小值对应的x8(0.027074)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:32:53