【发布时间】:2018-03-24 22:08:39
【问题描述】:
我正在尝试检查一个数据帧中的每组点与另一个数据帧中的分散点组之间的笛卡尔距离,以查看输入是否超过了我的检查点的阈值“距离”。
我可以使用嵌套的 for 循环,但速度非常慢(40k 输入行约 7 分钟,每行检查约 180 行,+ 一些开销操作)。
这是我正在尝试的矢量化格式 - '对于来自 df1 的每一对点 (a,b),如果从 df2 到任何点 (d,e) 的距离为 > 阈值,则将“是”打印到df1.c,在输入点旁边。
..但是我从中得到了意想不到的行为。对于给定的数据,除了一个距离之外,所有距离都 > 1,但只有 df1.1c 得到“是”。
感谢您的任何想法 - 问题可能出在“df1.loc...”行:
import numpy as np
from pandas import DataFrame
inp1 = [{'a':1, 'b':2, 'c':0}, {'a':1,'b':3,'c':0}, {'a':0,'b':3,'c':0}]
df1 = DataFrame(inp1)
inp2 = [{'d':2, 'e':0}, {'d':0,'e':3}, {'d':0,'e':4}]
df2 = DataFrame(inp2)
threshold = 1
df1.loc[np.sqrt((df1.a - df2.d) ** 2 + (df1.b - df2.e) ** 2) > threshold, 'c'] = "yes"
print(df1)
print(df2)
a b c
0 1 2 yes
1 1 3 0
2 0 3 0
d e
0 2 0
1 0 3
2 0 4
【问题讨论】:
-
这是预期的行为。正如你所说的
all but one distances > 1,这是C列中标记为yes的那个。 -
有 3x3 的距离要检查,所以 9 个中有 8 个是 >1。所有输入行都超过 dist = 1,所以都应该得到 yes。
标签: python-3.x pandas iteration