<p>这里的解决方案不需要额外的软件包。你知道吗</p>
<p>它们是定义两点<code>a</code>和<code>b</code>之间距离的函数。这里显示了欧几里德距离、曼哈顿距离和切比雪夫距离(归功于<a href="https://stackoverflow.com/a/56486031/10426037">@Peter Leimbigler answer</a>,他认识到最后一个距离是OP使用的距离)。<code>a</code>和<code>b</code>被假定为3长度的列表。您可以使用其中之一(甚至可以定义其他自定义的距离函数)。你知道吗</p>
<pre><code>def euclidean(a, b):
"""euclidean distance"""
return np.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2 + (a[2] - b[2])**2)
def manhattan(a, b):
"""manhattan distance"""
return abs(a[0] - b[0]) + abs(a[1] - b[1]) + abs(a[2] - b[2])
def cebyshev(a, b):
"""cebyshev distance"""
return max(abs(a[0] - b[0]), abs(a[1] - b[1]), abs(a[2] - b[2]))
</code></pre>
<p>下面的函数为点<code>point</code>返回dataframe <code>data</code>(这是您的dataframe)中<code>val</code>列的值之和,该列的坐标比距离<code>d</code>更近。<code>func</code>是用于计算距离的函数(以前的函数之一)。你知道吗</p>
<pre><code>def getclosesum(data, point, d, func):
dists = data.apply(lambda x : func(x, point), axis=1)
return data['val'].loc[dists <= d].sum()
</code></pre>
<p>最后,您可以使用<code>df.apply</code>计算列:</p>
<pre><code>for n in range(3):
df['n{0}'.format(n)] = df.apply(lambda x : getclosesum(df, x, n, cebyshev), axis=1)
</code></pre>
<p>使用您的示例数据帧,在我的机器上,此代码需要0.155秒才能完成任务,而您的原始代码需要0.233秒。<br/>
所以这比您的解决方案快,但没有@Peter Leimbigler提供的代码快(我打赌<code>scikit</code>更优化)。你知道吗</p>