在 pandas 数据框中计算点之间最短(欧几里德)距离的最快方法

2024-01-22

考虑以下 pandas 数据框:

print(df)

     Id      X      Y Type  X of Closest  Y of Closest
0   201  73.91  34.84    A           NaN           NaN
1   201  74.67  32.64    A           NaN           NaN
2   201  74.00  33.20    A           NaN           NaN
3   201  71.46  27.70    A           NaN           NaN
4   201  69.32  35.42    A           NaN           NaN
5   201  75.06  24.00    B           NaN           NaN
6   201  74.11  16.64    B           NaN           NaN
7   201  73.37  18.73    B           NaN           NaN
8   201  56.63  26.90    B           NaN           NaN
9   201  73.35  38.83    B           NaN           NaN
10  512  74.15  28.90    A           NaN           NaN
11  512  75.82  17.56    A           NaN           NaN
12  512  74.78  33.21    A           NaN           NaN
13  512  75.43  32.41    A           NaN           NaN
14  512  75.90  25.12    A           NaN           NaN
15  512  79.76  29.49    B           NaN           NaN
16  512  76.47  36.91    B           NaN           NaN
17  512  74.70  19.19    B           NaN           NaN
18  512  78.75  30.53    B           NaN           NaN
19  512  74.60  31.88    B           NaN           NaN

请注意,对于每个 Id,始终有 10 行,其中 5 行属于 A 类,5 行属于 B 类。

我想创建 2 列,“最近的 X”和“最近的 Y”。我的意思是,X,Y 对(每个 Id 的相反类型)是最短的欧几里德距离。

第一行的示例:与 (73.91, 34.84) 最接近的对(B 型)是对 (73.35,38.83) - 其欧氏距离为 4.03。

一种(可能!?)方法是构造 10 列 - 每个 Id 中的点之间的欧几里德距离,然后选择与相反 Type 的最小欧几里德距离。不过,我确信会有更快的方法。


对于快速(编码)解决方案,我们可以使用apply在分组依据上:

from scipy.spatial import distance_matrix

def get_min_dist(x):
    # compute distance matrix
    tmp = distance_matrix(x.iloc[:5], x.iloc[5:])

    # get index min of corresponding types
    idx = np.concatenate((np.argmin(tmp,1)+5),  # type A to type B
                          np.argmin(tmp, 0)     # type B to type A
                        )

    return pd.DataFrame(x.iloc[idx].values, 
                        index=x.index, 
                        columns=[a+'_closest' for a in x.columns])

df.groupby('Id')[['X','Y']].apply(get_min_dist)

Output:

    X_closest  Y_closest
0       73.35      38.83
1       73.35      38.83
2       73.35      38.83
3       75.06      24.00
4       73.35      38.83
5       71.46      27.70
6       71.46      27.70
7       71.46      27.70
8       71.46      27.70
9       73.91      34.84
10      74.60      31.88
11      74.70      19.19
12      74.60      31.88
13      74.60      31.88
14      79.76      29.49
15      75.43      32.41
16      74.78      33.21
17      75.82      17.56
18      75.43      32.41
19      75.43      32.41
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 pandas 数据框中计算点之间最短(欧几里德)距离的最快方法 的相关文章

随机推荐

  • QTableView排序信号?

    I use QTableView QStandardItemModel显示一些数据 存储在其他数据结构中的数据 这个表视图是sortable 由于它是可排序的 因此在对该模型进行排序时 我还需要对存储数据的顺序进行排序 我尝试为排序信号实现
  • 将数据上传到数据库时出现问题

    我在将数据发送到数据库时遇到问题 问题是每次我刷新页面时它都会自动发送以前的数据 任何人都可以帮忙吗 if isset POST Posts if isset POST t isset POST i isset POST P title P
  • Bootstrap 3 网格可以扩展吗?

    我正在开发一个项目 我们将保留 Bootstrap less 文件不变 我们也不想在 HTML 中使用 Bootstrap 类 因为我们将来可能不会使用它 我正在尝试使用 扩展 功能将我们的类名与样式表中的 BS 版本分组 除了网格列之外
  • 如何在 Laravel 中将模型事件与查询生成器一起使用

    我在模型的静态函数启动方法中使用诸如 static saving static saved 等模型事件 当用户保存新帖子时效果很好 但是当我执行以下操作时 post where id post id gt update array publ
  • 在纯 CSS 中将子级的宽度设置为父级的高度

    我可以设置width of a child div等于它的parent div height在纯CSS中 JsFiddle 演示 http jsfiddle net evk9a9ma 到目前为止 我一直在 jQuery 中做 child d
  • Z3Py 中最大值的模型不正确

    我想找到一个表达式的最大间隔e对于所有 x 都成立 编写这样的公式的方法应该是 Exists d ForAll x in d d e and ForAll x not in d d e 为了得到这样一个d 公式f在 Z3 中 看上面的 可能
  • 使用maven archetype创建新项目如何指定自定义文件夹名称

    我现在正在尝试创建一个 Maven 原型 它使用spring mybatis框架 有一个mybatis xml文件 src main resources archetype resources src main resources sql
  • 如何以编程方式设置layout_weight?

    免责声明 据我所知这个问题到目前为止 XAMARIN ANDROID 还没有答案 已经回答过多次了安卓 Java https stackoverflow com questions 4641072 how to set layout wei
  • 时间校正 Verlet 积分和太大的时间步长

    我使用在这里找到的时间校正 Verlet 集成 http www gamedev net page resources technical math and physicals a simple time Corrected verlet
  • 在 Git 中,长哈希和短哈希有什么区别?

    这是长 Git 哈希值 提交 c26cf8af130955c5c67cfea96f9532680b963628 合并 8654907 37c2a4f 作者 尼古拉斯 日期 2017 年 4 月 26 日星期三 13 28 22 0400 这
  • 在 Django 中将 numpy 数组显示为图像

    我是 Django 框架的新手 我正在构建一个网站 该网站从用户那里获取图像 然后处理图像并返回到 numpy 数组 处理后的图像 我想将 numpy 数组显示为图像 我怎样才能做到这一点 感谢您的阅读并提供帮助 索引 html
  • 访问 OKHttp 响应正文

    所以我需要弄清楚如何在第二个响应中访问我从第一个响应中获得的值 我认为我可以将其存储到一个变量中并在另一个请求中访问它 然而 情况似乎并非如此 这是给我带来问题的一点 因此 我的第一个请求是获取一个令牌 然后我需要在第二个请求中使用存储在
  • 从 MYSQL 表中选择添加前缀的最大数字

    不幸的是 我有一张桌子 我无法以任何方式进行更改 并且必须使用我所拥有的东西 mysql 表有一个标记为 customer id 的字段 它有 2 个前缀字母和一个 4 值数字 前任 BI8392 HE8492 WO1293 如何选择具有特
  • 为什么当前目录不在我的 Ruby 路径上? [复制]

    这个问题在这里已经有答案了 我当前的工作目录不在我的 Ruby 路径上有什么原因吗 考虑 499 irb ruby 1 9 2 p136 002 gt puts Users mrberryman rvm rubies ruby 1 9 2
  • 如何检查文件是否仍在写入?

    如何检查文件是否仍在写入 我需要等待另一个进程再次创建 写入和关闭文件 以便我可以继续在我的进程中再次打开它 总的来说 这是一个很难解决的问题 您可以询问文件是否open 在某些情况下 但是 如果另一个进程是脚本 它很可能多次打开和关闭该文
  • Maven:POM.xml 中缺少工件 com.sun:tools:jar:1.6.0 编译时异常 [重复]

    这个问题在这里已经有答案了 当我尝试添加工具的依赖项时 我遇到一个奇怪的问题 并在我的 pom xml 中遇到编译时异常 jar显示如下 缺少工件 com sun tools jar 1 6 0 我已将 JAVA HOME 变量设置如下 J
  • CSS:显示属性差异

    显示 块和显示 内联有什么区别 显示 块将导致该对象强制容器内的其他对象到新行 显示方式 内嵌尝试将该对象显示在与其他对象相同的行上 显示 块 Item 1 Item 2 Item 3 显示 内嵌 Item 1 Item 2 Item 3
  • 一个字段的多个值,采用逗号分隔值 .csv 格式

    csv 文件中的同一字段下是否可以有多个值 我的网页上有一个 电子邮件 字段 用户可以选择输入多个地址 我希望我的 csv 文件能够处理任意数量的 电子邮件 值 我怎样才能实现这个目标 csv 由第三方程序读取 我无法修改 是的 CSV 文
  • 如何访问 JSONObject 子字段?

    我觉得很愚蠢 但我已经四处寻找这一点有一段时间了 我正在使用 google geocoder API 我需要一些关于 json 响应的帮助 这是我拥有的一个 JSONObject viewport southwest lng 78 9233
  • 在 pandas 数据框中计算点之间最短(欧几里德)距离的最快方法

    考虑以下 pandas 数据框 print df Id X Y Type X of Closest Y of Closest 0 201 73 91 34 84 A NaN NaN 1 201 74 67 32 64 A NaN NaN 2