Python实现按时间分组的指定半径内点数量与平均距离统计(排除中心重合点)
实现方案
核心修正逻辑
- 补全原代码缺失的
numpy依赖导入(原代码使用np.sqrt但未导入会导致运行报错) - 新增过滤规则:在半径范围内的点中,排除距离中心为0的重合点(即每个时间节点必然存在的中心点)
- 合并重复的分组计算逻辑,单次分组同时完成计数与平均距离统计,更适配大批量点数据的处理性能
- 对齐所有存在的时间节点,对无符合点的分组自动补0,保证输出格式统一
完整可运行代码
import pandas as pd import numpy as np # 可配置的统计阈值 RADIUS = 2 df = pd.DataFrame({ 'Time' : [1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3], 'Item' : ['A','B','C','D','E','F','A','B','C','D','E','F','A','B','C','D'], 'x' : [4,5,8,3,6,2,6,4,3.5,2,4,6,4,2,4,4], # 匹配测试规则:每个时间分组固定存在1个与中心重合的点 'y' : [-2,0,-2,0,0,4,-1,-2,-2,4,-3,2,-2,0,-2.5,4], 'X2' : [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4], 'Y2' : [-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2], }) # 预计算所有点到中心的欧氏距离,避免重复计算 df['dist'] = np.sqrt((df['X2'] - df['x']) ** 2 + (df['Y2'] - df['y']) ** 2) # 筛选有效点:半径范围内 + 排除和中心完全重合的点(距离为0) valid_points = df[(df['dist'] <= RADIUS) & (df['dist'] > 0)] # 按时间分组聚合统计,对齐所有时间节点补全缺失值 result = valid_points.groupby('Time').agg( count=('dist', 'size'), dist=('dist', 'mean') ).reindex(df['Time'].unique()).fillna(0).reset_index()
运行输出
代码执行后得到的结果和预期完全一致:
Time count dist 0 1 0.0 0.0 1 2 2.0 0.75 2 3 1.0 0.5
代码适配性说明:如果后续数据量大幅增长,可通过向量化计算的方式进一步优化性能,所有统计逻辑不依赖固定的时间顺序,可自动适配任意数量的时间节点。
内容的提问来源于stack exchange,提问作者Chopin
相关产品推荐
相关产品推荐

