如何用Numpy/Scipy函数计算Polars DataFrame列的坐标距离
解决Polars DataFrame中坐标列的距离计算问题
你遇到的核心问题是直接用numpy/scipy的函数处理Polars列表达式(Expr)无效——这些函数是针对numpy数组设计的,而Polars的pl.col()返回的是延迟执行的表达式对象,不是直接的数据数组。另外你代码里的列名写错了(用了大写C,实际是小写c),这也会导致报错。
下面提供两种可行的解决方案:
方案1:用Polars内置数组运算(无需依赖numpy/scipy)
直接通过Polars的数组操作计算欧氏距离,性能更贴合Polars的优化逻辑:
df = df.with_columns( # 计算两列表对应元素的差,平方后求和再开平方 (pl.col("c") - pl.col("d")) .arr.map(lambda arr: arr.pow(2).sum().sqrt()) .alias("distance") )
或者用更高效的arr.eval方式:
df = df.with_columns( pl.col("c") .arr.eval(pl.element() - pl.col("d"), parallel=True) .arr.map(lambda arr: (arr ** 2).sum() ** 0.5) .alias("distance") )
方案2:用map_elements调用numpy/scipy的函数
如果一定要用你找到的numpy或scipy方法,需要用map_elements逐行处理每个坐标列表:
用numpy.linalg.norm的例子
df = df.with_columns( pl.struct(["c", "d"]) .map_elements(lambda row: np.linalg.norm(row["c"] - row["d"]), return_dtype=pl.Float64) .alias("distance") )
用scipy.spatial.distance的例子
df = df.with_columns( pl.struct(["c", "d"]) .map_elements(lambda row: distance.euclidean(row["c"], row["d"]), return_dtype=pl.Float64) .alias("distance") )
执行上述任意方案后,打印df就能看到新增的distance列,包含每组坐标的欧氏距离。
内容的提问来源于stack exchange,提问作者Artup
相关产品推荐
相关产品推荐

