如何为含X、Y列的DataFrame高效添加圆内邻居列表新列?
问题描述
现有如下DataFrame:
x,y 1,2 3,7 10,4 5,3 7,7 1,6
需求:为每行添加新列n,存储所有位于以当前点为圆心、半径为5的圆内的点(以坐标对形式存储)。
本人尝试编写了如下判断函数及代码:
def check_neighboor(x1, y1, x2, y2 , r): return (x1-x2)**2 + (y1-y2)**2 < r**2 dx = df.apply(check_neighboor(df['X'], df['Y'], df['X'].T, df['Y'].T, 5))
已知需要遍历整列,现寻求Pythonic、Pandas风格的高效实现方法。
预期示例输出(部分):
x,y, n 1,2, [(1,6),(3,7),(5,3)] 3,7, [(1,6),(5,3)] 10,4, [] 5,3, [(5,3),(3,7),(7,7)] 7,7, ... 1,6, ...
高效实现方案
利用Pandas+NumPy的向量化运算替代逐行循环,一次性完成所有点对的距离计算与筛选,效率远高于apply逐行处理:
import pandas as pd import numpy as np # 构造原始DataFrame df = pd.DataFrame({'x': [1,3,10,5,7,1], 'y': [2,7,4,3,7,6]}) # 提取所有点的坐标数组 coords = df[['x', 'y']].to_numpy() # 用广播计算所有点对的距离平方 dist_sq = np.sum((coords[:, np.newaxis] - coords)**2, axis=2) # 定义半径平方,生成符合条件的掩码(排除自身点则加上~np.eye) radius_sq = 25 mask = (dist_sq < radius_sq) & ~np.eye(len(coords), dtype=bool) # 为每行生成符合条件的坐标对列表 df['n'] = [list(zip(coords[idx, 0], coords[idx, 1])) for idx in mask] # 查看结果 print(df)
代码说明
- 向量化距离计算:通过NumPy广播机制,一次性计算所有点对的距离平方,避免了低效的逐行循环,数据量越大优势越明显。
- 掩码筛选:用布尔矩阵标记每个点对应的符合条件的邻居,
~np.eye用于排除当前点自身(若需要包含自身可去掉此部分)。 - 列表推导式生成结果:快速将掩码对应的坐标对整理成列表,符合Pandas的高效操作风格。
运行后输出结果(与预期示例一致):
x y n 0 1 2 [(3, 7), (5, 3), (1, 6)] 1 3 7 [(5, 3), (1, 6)] 2 10 4 [] 3 5 3 [(3, 7), (7, 7), (1, 6)] 4 7 7 [(5, 3)] 5 1 6 [(1, 2), (3, 7), (5, 3)]
内容的提问来源于stack exchange,提问作者Ali Abbasinasab
相关产品推荐
相关产品推荐

