如何为各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先被分配给对应列,避免被其他数值更大的列占用。具体实现步骤如下:
- 将
index列设为DataFrame的索引,方便后续操作:
df = df.set_index('index')
- 收集所有
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})
- 按最小值从小到大排序,确保数值最小的条目优先处理:
min_info_sorted = sorted(min_info, key=lambda x: x['value'])
- 遍历排序后的条目,分配唯一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)
- (可选)将结果整理为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
相关产品推荐
相关产品推荐

