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

如何以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:43:28