python - 检查坐标数据帧的多个切片之间的最小距离
问题描述
有两组带有单元格 ID 的列表
A = [4, 6, 2493, 2494, 2495]
B = [3, 7, 4983, 4982, 4984, 4981, 4985, 2492, 2496]
并且上列表中的每个单元格X, Y
在 df 的单独列中都有坐标,每个。
df
cell_ID; X ;Y
1; 5; 6
2; 10; 6
...
其中A
,B
列表中的值是cell_id
列中的值。我怎样才能找到sum
A 和 B 中单元格之间的距离,但主要是查看与A
相关的单元格B
?所以我必须为 A 中的每个单元格计算 5 个(A 长度)距离,取min()
这 5 个和sum()
所有这 9 个最小值。我希望这是有道理的
我在想以下几点:
- 从列表 A 中获取第一个值(这是 id = 4 的单元格)并计算 B 中所有单元格之间的距离,然后仅获取该
min
值 - 对 A 中的所有其他值重复步骤 1
- 做一个
sum()
所有的距离
我尝试使用下面的代码......但失败了
def sum_distances(df, i, col_X='X', col_Y='Y'):
for i in range(A)
return (((df.iloc[B][col_X] - df.iloc[i,2])**2 + (df.iloc[B][col_Y] - df.iloc[i,3])**2)**0.5).min
我不知道如何整合min()
和sum()
同时。
解决方案
如果我没记错的话,你正在寻找坐标之间的欧几里得距离(x,y)
。这是一种可能的方法(基于this SO post)
生成一些与OP相同格式的虚拟数据
import pandas as pd
import numpy as np
A = [0, 1, 2, 3, 4]
B = [10, 11, 12, 13, 14, 9, 8, 7, 6]
df = pd.DataFrame(np.random.rand(15,2), columns=['X','Y'], index=range(15))
df.index.name = 'CellID'
print('Raw data\n{}'.format(df))
Raw data
X Y
CellID
0 0.125591 0.890772
1 0.754238 0.644081
2 0.952322 0.099627
3 0.090804 0.809511
4 0.514346 0.041740
5 0.678598 0.230225
6 0.594182 0.432634
7 0.005777 0.891440
8 0.925187 0.045035
9 0.903591 0.238609
10 0.187591 0.255377
11 0.252635 0.149840
12 0.513432 0.972749
13 0.433606 0.550940
14 0.104991 0.440052
得到 B 和 A 的每个索引之间的最小距离
# Get df at indexes from list A: df_A
df_A = df.iloc[A,]
# For df at each index from list B (df.iloc[b,]), get distance to df_A: d
dist = []
for b in B:
d = (pd.DataFrame(df_A.values - df.iloc[b,].values)**2).sum(1)**0.5
dist.append(d.min())
print('Sum of minimum distances is {}'.format(sum(dist)))
输出(对于 B 和 A 的每个索引之间的最小距离之和)
Sum of minimum distances is 2.36509386378
推荐阅读
- c++ - 在 C++ 中按名称从页面源获取页面信息
- javascript - Search input onchange causes crashing - how to make it a button to submit search
- c# - CQRS 模式中的 Resharper 导航
- ag-grid - Ag-Grid - 从 RowNode 获取单元格列表
- php - 通过 Laravel 刀片视图中的多个关系获取外键名称
- json - 从 API 到 React-Native 的 HTML
- angular - Safari 面临 Angular 8 的 MSAL 登录问题,登录在 chrome、edge 中工作正常
- css - 如何让除法和数学函数在更少的时间内处理可变映射项
- java - 使用侦听器无构造函数初始化片段
- angular - 如何根据 ionic 4 中的日期推送日历上的数据计数