为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯709654 2022-01-11 16:04:24
我想检查来自 dataframe-1 (df1) 的坐标 (x,y,z),以查看该位置是否足够接近具有存储在 dataframe-2 中的自己的坐标 (x,y,z) 的不规则表面(df2)。我能够遍历 df1 中的每个坐标,然后遍历 df2 中的所有坐标并检查它的距离。然后对 df1 中的所有坐标重复,但是当我在 df1 中有超过 1,000,000 个坐标要检查时,这将花费很长时间。我正在使用熊猫,想知道是否可以在不循环的情况下完成。如果 df1 中的坐标接近 df2,那么我想选择它并将其存储到 df3 中。
查看完整描述

2 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

Scipy 可以帮助你。请看以下假设示例:


import pandas as pd 

from scipy.spatial import cKDTree


dataset1 = 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)


查看完整回答
反对 回复 2022-01-11
?
函数式编程

TA贡献1807条经验 获得超9个赞

使用 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


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信