如何向pandas DataFrame中插入邻点坐标数组且避免使用for循环?
问题原因
你原有代码的错误主要有两点:
indices_Neighbours是独立于DataFrame的外部数组,不属于DataFrame的列,无法通过行对象的属性访问np.array传参格式错误,不能将三个独立的Series作为参数直接传入
最优实现方案(高性能,适配GB级数据)
先把坐标转成numpy数组,直接通过索引批量取值,避免pandas行级遍历的开销:
# 先把所有坐标转成numpy数组,每一行对应一个点的[X,Y,Z]坐标 coord_array = inFile[["X", "Y", "Z"]].values # 直接用邻点索引数组批量取坐标,转成要求的列表格式 inFile["Neighbours_Coordinates"] = [coord_array[idx].tolist() for idx in indices_Neighbours]
方案说明
- 全程都是numpy向量化索引操作,列表推导的开销远低于pandas的
apply行遍历,处理GB级数据时性能优势非常明显 - 输出格式和你要求的完全一致,每个单元格存储所有邻点坐标组成的二维列表
修复原有apply写法(不推荐,性能更低)
如果你一定要用apply实现,也可以修改为如下可运行版本,但处理大数据量时速度会慢很多:
coord_array = inFile[["X", "Y", "Z"]].values inFile["Neighbours_Coordinates"] = inFile.apply( lambda row: coord_array[indices_Neighbours[row.name]].tolist(), axis=1 )
内容的提问来源于stack exchange,提问作者Sadae
相关产品推荐
相关产品推荐

