【问题标题】:compare each data points between every data point between two dataframes without looping在不循环的情况下比较两个数据帧之间的每个数据点之间的每个数据点
【发布时间】:2019-04-16 16:31:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您需要显示您的数据框和您的预期输出。这样更容易提供帮助。
  • df1 = 0.0112703 -0.0343516 -0.013851 0.0110492 -0.0343281 -0.0136868 0.0108239 -0.0342809 -0.0134757 0.0105686 -0.0342081 -0.0132085 df2= nodenumber, x-coordinate, y-coordinate, z-coordinate 1, 2.555290703E- 04,-8.828905970E-02,-3.719565645E-02 2, 2.415552590E-04,-8.784820884E-02,-3.719100356E-02 3, 3.034976253E-04,-8.8743925971E-71.3,-71.3 ..

标签: python pandas


【解决方案1】:

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)

array([list([]), list([]), list([]), list([]), list([28, 83]), 列表([79]), list([]), list([86]), list([40]), list([29, 60, 95])], dtype=object)

【讨论】:

  • 哇!谢谢 :) 我有大约 100 万个粒子可以随时间追踪,我想知道它们中的任何一个是否靠近或穿过不规则的表面,这非常有效。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 2019-01-02
    • 2018-09-27
    • 1970-01-01
    • 2021-06-19
    • 2020-10-02
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多