在不循环的情况下比较两个数据帧之间的每个数据点之间的每个数据点

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

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

我正在使用熊猫,想知道是否可以在不循环的情况下完成。

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


慕斯709654
浏览 145回答 2
2回答

HUX布斯

Scipy 可以帮助你。请看以下假设示例:import pandas as pd from scipy.spatial import cKDTreedataset1 = pd.DataFrame(pd.np.random.rand(100,3))dataset2 = pd.DataFrame(pd.np.random.rand(10, 3))ck = cKDTree(dataset1.values)ck.query_ball_point(dataset2.values, r=0.1)数组([列表([]),列表([]),列表([]),列表([]),列表([28, 83]),列表([79]),列表([]),列表([86]), 列表([40]), 列表([29, 60, 95])], dtype=object)

函数式编程

使用 Numpy 方法:如果您的两个数据框如下所示:df1&nbsp; &nbsp; coords0&nbsp; &nbsp;(4,3,5)1&nbsp; &nbsp;(5,4,3)df2&nbsp; &nbsp; coords0&nbsp; &nbsp;(6,7,8)1&nbsp; &nbsp;(8,7,6)然后:import numpy as npfrom itertools import product#convert dataframes into numpy arraysdf1_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 arrayscart_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 coordinatesnorms_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 thresholdgood_idxs = np.argwhere(norms_arr <= radius)[:,0]good_coord_pairs = cart_arr[good_idxs]#store corresponding pairs of coordinates and distances in new dataframefinal_df = pd.DataFrame({'df1_coords':list(map(tuple,good_coord_pairs[:,0,:])),&nbsp; &nbsp;'df2_coords':list(map(tuple(good_coord_pairs[:,1,:])), 'distance':norms_arr[good_idxs],&nbsp; &nbsp;index=list(range(len(good_coord_pairs))))将产生:final_df&nbsp; &nbsp; df1_coords&nbsp; df2_coords&nbsp; distance0&nbsp; &nbsp;(4,3,5)&nbsp; &nbsp; &nbsp;(6,7,8)&nbsp; &nbsp; &nbsp;5.3851651&nbsp; &nbsp;(5,4,3)&nbsp; &nbsp; &nbsp;(8,7,6)&nbsp; &nbsp; &nbsp;5.196152
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python