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

如何为含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:01:16