如何在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)
代码说明
df.diff():自动计算每一列中当前行与前一行的差值,第一行因无前置行结果为NaN。(diff ** 2).sum(axis=1):对每行的差值平方求和,对应欧氏距离公式中的平方和环节。np.sqrt(...):对平方和开根号,得到最终的欧氏距离。fillna(0):处理第一行的缺失值,你也可以根据业务场景替换为其他合理值。
优势对比
- 彻底避免
apply带来的逐行循环开销,处理十万级以上数据时,速度可提升几十至上百倍。 - 代码逻辑直接对应欧氏距离的数学公式,简洁直观,可读性更强。
内容的提问来源于stack exchange,提问作者Noah Weber
相关产品推荐
相关产品推荐

