如何以Pythonic方式获取Polars DataFrame所有列的绝对最大值?
获取Polars DataFrame所有列的绝对最大值(优化方案)
你的实现可以正常运行,但存在依赖外部库、手动循环效率低、逻辑不够简洁的问题。以下是基于Polars原生表达式的优化方案,完全利用Polars的向量化能力,代码更高效清晰。
优化实现(Polars 0.19+)
利用max_by方法直接根据绝对值大小取对应值,同时通过类型判断处理非数值列:
import polars as pl df = pl.DataFrame({ "name": ["one", "one", "one", "two", "two", "two"], "val1": [1.2, -2.3, 3, -3.3, 2.2, -1.3], "val2": [1,2,3,-4,-3,-2] }) # 生成每列的计算表达式 df_out = df.select( [ pl.when(pl.col(col).is_numeric()) .then(pl.col(col).max_by(pl.col(col).abs())) # 按绝对值取最大的原值 .otherwise(pl.lit(None)) # 非数值列返回null .cast(pl.Float64) # 统一转为f64类型,和原输出一致 .alias(col) for col in df.columns ] ) print(df_out)
输出结果:
shape: (1, 3) ┌──────┬──────┬──────┐ │ name ┆ val1 ┆ val2 │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 │ ╞══════╪══════╪══════╡ │ NaN ┆ -3.3 ┆ -4.0 │ └──────┴──────┴──────┘
方案优势
- 性能更高:完全使用Polars向量化表达式,避免Python循环,处理大数据集时优势明显
- 逻辑清晰:通过
is_numeric()明确筛选数值列,替代try-except捕获异常的模糊处理 - 原生兼容:无需依赖numpy,纯Polars实现,符合库的设计规范
- 类型可控:可选择保留原列类型或统一转换,灵活度更高
如果不需要统一转为f64类型,去掉.cast(pl.Float64)即可,非数值列会保留原类型并返回null。
内容的提问来源于stack exchange,提问作者beta green
相关产品推荐
相关产品推荐

