<p>将此操作矢量化的一个解决方案是使用Numpy及其出色的广播功能。这为中小型数据帧提供了一个快速的解决方案,但它会随着<code>mask</code>的<code>O[n*m]</code>(对于<code>df1</code>的<code>n</code>行和<code>df2</code>行的<code>m</code>行的<code>mask</code>而增长(在时间和内存上),因此最终对于大型数据帧来说速度会变慢</p>
<pre class="lang-py prettyprint-override"><code>a = df1[['latitude', 'longitude']].values
vmin = df2[['minlat', 'minlong']].values
vmax = df2[['maxlat', 'maxlong']].values
mask = (vmin[None, :, :] <= a[:, None, :]).all(2) & (a[:, None, :] <= vmax[None, :, :]).all(2)
has_any = mask.any(1)
first = mask.argmax(axis=1)
label = np.full(len(df1), None, dtype=object)
label[has_any] = df2['STRING'].values[first[has_any]]
>>> df1.assign(LABEL=label)
latitude longitude LABEL
0 1.3 2.7 AAA
1 3.5 3.6 CCC
2 2.8 3.0 None
3 9.7 1.9 None
4 6.2 5.7 None
5 1.7 3.4 None
6 3.5 1.4 BBB
7 2.7 6.6 None
8 1.7 2.7 AAA
9 1.3 1.3 AAA
</code></pre>
<p><strong>解释</strong></p>
<p>关键部分是<code>mask</code>的构造。有必要对其进行细分,以了解其机制及其如何使用Numpy的广播:</p>
<pre class="lang-py prettyprint-override"><code>>>> vmin[None, :, :] <= a[:, None, :]
[[[ True True]
[False True]
[False False]
[False True]]
[[ True True]
[ True True]
[ True True]
[False True]]
...
[[ True True]
[False True]
[False False]
[False False]]]
</code></pre>
<p>如您所见,上面将<code>a</code>和<code>vmin</code>之间的所有比较扩展到第三维。然后我们用逻辑“所有第三轴(经度和纬度)都必须为真”投射回2D:</p>
<pre class="lang-py prettyprint-override"><code>>>> (vmin[None, :, :] <= a[:, None, :]).all(2)
[[ True False False False]
[ True True True False]
[ True False False False]
[ True True False False]
[ True True True True]
[ True False False False]
[ True True False False]
[ True False False False]
[ True False False False]
[ True False False False]]
</code></pre>
<p>以上表示高于<code>df2.iloc[j]</code>最小值的所有点<code>df1.iloc[i]</code>为<code>...[i, j]</code></p>
<p>我们对<code>vmax</code>做了同样的处理,得到的<code>mask</code>是<code>df1.iloc[i]</code>的所有点都在<code>df2.iloc[j]</code>的边界框中</p>
<p>接下来的两位是<code>has_any</code>和<code>first</code>。前者表示<code>df1</code>中的哪些点至少位于一个边界框中。后者是第一个这样的边界框(如<code>df2</code>中的索引)</p>
<p>其余的都是不言自明的</p>
<p><strong>注释</strong></p>
<p>请注意,这使用了<code>O[n*m]</code>比较(对于<code>df1</code>的<code>n</code>行和<code>df2</code>的<code>m</code>行),这对于大型矩阵来说可能太慢(尽管因为它是矢量化的,所以对于中型矩阵来说速度非常快)</p>
<p>对于大型矩阵,更好的方法包括排序或使用KD树。见<a href="https://stackoverflow.com/a/68927974/758174">this other answer</a></p>