我想检查数据框1(df1)中的坐标(x,y,z),以查看该位置是否足够接近不规则曲面,该曲面具有自己的坐标(x,y,z)存储在其中数据帧2(df2)。
我能够遍历df1中的每个坐标,然后遍历df2中的所有坐标并检查它的距离。然后对df1中的所有坐标重复上述操作,但是当我要检查df1中的超过1,000,000个坐标时,这将花费很长时间。
我正在使用熊猫,想知道它是否可以不循环而完成。
如果df1中的坐标接近df2,那么我想选择它并将其存储到df3中。
答案 0 :(得分:1)
Scipy可以为您提供帮助。看下面的假设示例:
If CheckLotIDExist = "Y" Then
'do something here
Else
LblMsg.Text = "Lot Not Foundzz!"
ScriptManager.RegisterStartupScript(Page, Page.GetType, "script", "callbtn();", True)
End If
array([list([]),list([]),list([]),list([]),list([28,83]), 清单([79]), list([]),list([86]),list([40]),list([29、60、95])],dtype = object)
答案 1 :(得分:1)
使用Numpy方法:
如果您的两个数据框如下所示:
df1
coords
0 (4,3,5)
1 (5,4,3)
df2
coords
0 (6,7,8)
1 (8,7,6)
然后:
import numpy as np
from itertools import product
#convert dataframes into numpy arrays
df1_arr = np.array([np.array(x) for x in df1.coords.values])
df2_arr = np.array([np.array(x) for x in df2.coords.values])
#create array of cartesian product of elements of the two arrays
cart_arr = np.array([x for x in product(df1_arr,df2_arr)])
#compute Euclidian distance (or norm) between pairs of elements in two arrays
#outputs new array with one value per pair of coordinates
norms_arr = np.linalg.norm(np.diff(cart_arr,axis=1)[:,0,:],axis=1)
#create distance threshold for "close enough"
radius = 5.5
#find values in norms array that are less than or equal to distance threshold
good_idxs = np.argwhere(norms_arr <= radius)[:,0]
good_coord_pairs = cart_arr[good_idxs]
#store corresponding pairs of coordinates and distances in new dataframe
final_df = pd.DataFrame({'df1_coords':list(map(tuple,good_coord_pairs[:,0,:])),
'df2_coords':list(map(tuple(good_coord_pairs[:,1,:])), 'distance':norms_arr[good_idxs],
index=list(range(len(good_coord_pairs))))
将产生:
final_df
df1_coords df2_coords distance
0 (4,3,5) (6,7,8) 5.385165
1 (5,4,3) (8,7,6) 5.196152