You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DataFrame中基于两行两列滚动应用欧氏距离函数

高效计算DataFrame相邻行的欧氏距离

问题描述

假设我有如下DataFrame(实际数据量更大,因此需要高效方法):

import pandas as pd
import numpy as np

df = pd.DataFrame({"distance1": [101, 102, 103], "distance2":[12, 33, 44]})
# 实际数据结构:
#    distance1  distance2
# 0        101         12
# 1        102         33
# 2        103         44

我需要计算当前行(n)与前一行(n-1)的distance1和distance2的欧氏距离,原本尝试用如下函数结合apply实现,但效率太低:

def distance(x):
    return np.sqrt(np.power(x.loc[n, "distance1"] - x.loc[n-1 ,"distance1"], 2) + np.power(x.loc[n, "distance2"] - x.loc[n-1 ,"distance2"], 2))

df["dist"] = df.apply(distance, axis=1)

请问如何高效实现这一基于两行两列的滚动计算?


高效实现方案

直接利用Pandas和NumPy的向量运算替代逐行循环的apply,这是处理大数据量的最优选择——向量运算底层基于C实现,远快于Python层面的循环逻辑。

具体代码

# 计算每列相邻行的差值
diff = df.diff()
# 计算差值平方和的平方根(欧氏距离)
df["dist"] = np.sqrt((diff ** 2).sum(axis=1))
# 第一行无前置行,填充缺失值(可根据需求替换为0或其他值)
df["dist"] = df["dist"].fillna(0)

代码说明

  1. df.diff():自动计算每一列中当前行与前一行的差值,第一行因无前置行结果为NaN。
  2. (diff ** 2).sum(axis=1):对每行的差值平方求和,对应欧氏距离公式中的平方和环节。
  3. np.sqrt(...):对平方和开根号,得到最终的欧氏距离。
  4. fillna(0):处理第一行的缺失值,你也可以根据业务场景替换为其他合理值。

优势对比

  • 彻底避免apply带来的逐行循环开销,处理十万级以上数据时,速度可提升几十至上百倍。
  • 代码逻辑直接对应欧氏距离的数学公式,简洁直观,可读性更强。

内容的提问来源于stack exchange,提问作者Noah Weber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:39:20