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

Python-Polars如何在表达式中使用左移运算符实现指定计算

解决Polars中高效实现整数移位合并列的问题

在Polars Python中,确实不能直接使用Python原生的<<运算符对Expr对象进行移位操作,不过可以通过Polars内置的向量化表达式方法高效实现你需要的计算,完全不用依赖低效的lambda函数。

核心实现思路

  1. 类型转换:因为val1是f32类型,val1 * 100的结果还是浮点数,而移位操作要求整数类型,所以先将其转换为足够大的整数类型(比如Int64,避免溢出)。
  2. 左移运算:使用Polars Expr的shift_left()方法替代<<,这是底层由Rust实现的向量化操作,效率远高于Python层面的循环处理。如果需要检查移位是否溢出,可以用checked_shift_left()(对应你提到的Rust版CheckedShl)。
  3. 合并计算:将移位后的结果与val2相加,得到最终的合并列。

代码示例

首先构造测试用DataFrame:

import polars as pl

# 创建包含f32和i32类型列的DataFrame
df = pl.DataFrame({
    "val1": [1.23, 4.56, 7.89],
    "val2": [100, 200, 300]
}).with_columns(
    pl.col("val1").cast(pl.Float32),
    pl.col("val2").cast(pl.Int32)
)

然后执行合并计算:

# 高效实现公式 ((val1 * 100) << 16) + val2
df_result = df.select(
    pl.col("val1")
    .mul(100)          # 计算val1 * 100
    .cast(pl.Int64)    # 转换为Int64类型,避免移位溢出
    .shift_left(16)    # 左移16位,替代<<运算符
    .add(pl.col("val2"))  # 加上val2
    .alias("combined") # 命名新列
)

print(df_result)

如果需要溢出检查,可以替换为checked_shift_left(16):

df_result = df.select(
    pl.col("val1")
    .mul(100)
    .cast(pl.Int64)
    .checked_shift_left(16)  # 移位溢出时返回None
    .add(pl.col("val2"))
    .alias("combined")
)

为什么这个方法高效

Polars的表达式方法都是向量化批量操作,直接在Rust执行引擎中处理数据,避免了Python lambda函数逐行处理的开销,在处理大规模数据集时性能差距会非常明显。

内容的提问来源于stack exchange,提问作者basesorbytes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:55:59