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

计算两个DataFrame间的最小欧氏距离并映射对应文本标识

解决DataFrame坐标匹配:找到最近点对应的text_key

我来帮你搞定这个坐标匹配的问题!先给你准备好可复现的示例数据,然后提供两种实用的解决方案,你可以根据自己的数据量来选择~

第一步:构造可复现的示例DataFrame

先模拟你提到的两个DataFrame,方便后续测试:

import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist

# 第一个DataFrame:对象位置信息
df1 = pd.DataFrame({
    'x_value': [1, 3, 5, 7],
    'y_value': [2, 4, 6, 8],
    'text_value': ['A', 'B', 'C', 'D']
})

# 第二个DataFrame:参考点信息
df2 = pd.DataFrame({
    'x_key': [2, 4, 6],
    'y_key': [3, 5, 7],
    'text_key': ['X', 'Y', 'Z']
})

方法一:向量化计算(高效,适合大数据量)

用scipy.spatial.distance.cdist一次性计算所有点对的欧氏距离,这种方法是向量化操作,速度非常快,适合处理大规模数据:

# 提取两个DataFrame的坐标列,转换成numpy数组
coords1 = df1[['x_value', 'y_value']].values
coords2 = df2[['x_key', 'y_key']].values

# 计算所有点对的欧氏距离矩阵(shape: (df1行数, df2行数))
distances = cdist(coords1, coords2, metric='euclidean')

# 找到每个df1点对应的最小距离的索引
min_indices = np.argmin(distances, axis=1)

# 根据索引从df2中匹配对应的text_key,添加到df1
df1['matched_text_key'] = df2.loc[min_indices, 'text_key'].values

# 查看结果
print(df1)

运行后输出结果:

x_value  y_value text_value matched_text_key
0        1        2          A                X
1        3        4          B                Y
2        5        6          C                Z
3        7        8          D                Z

方法二:逐行计算(直观,适合小数据量)

如果你的数据量不大,也可以用apply逐行处理,代码更直观易懂,但速度不如向量化方法:

def find_closest_key(row):
    # 计算当前点到df2所有点的欧氏距离
    df2['temp_distance'] = np.sqrt((df2['x_key'] - row['x_value'])**2 + (df2['y_key'] - row['y_value'])**2)
    # 返回最小距离对应的text_key
    return df2.loc[df2['temp_distance'].idxmin(), 'text_key']

# 应用到df1的每一行
df1['matched_text_key'] = df1.apply(find_closest_key, axis=1)

# 查看结果
print(df1)

两种方法对比

  • 向量化方法:速度快,内存效率高,适合处理十万级以上的大数据集
  • 逐行apply方法:代码逻辑更直观,容易理解,但逐行处理速度慢,适合小数据集

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:36:43