比较两个数据帧之间的每个数据点之间的每个数据点而无需循环

时间:2019-04-16 05:46:10

标签: python pandas

我想检查数据框1(df1)中的坐标(x,y,z),以查看该位置是否足够接近不规则曲面,该曲面具有自己的坐标(x,y,z)存储在其中数据帧2(df2)。

我能够遍历df1中的每个坐标,然后遍历df2中的所有坐标并检查它的距离。然后对df1中的所有坐标重复上述操作,但是当我要检查df1中的超过1,000,000个坐标时,这将花费很长时间。

我正在使用熊猫,想知道它是否可以不循环而完成。

如果df1中的坐标接近df2,那么我想选择它并将其存储到df3中。

2 个答案:

答案 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