Python-Polars如何在表达式中使用左移运算符实现指定计算
解决Polars中高效实现整数移位合并列的问题
在Polars Python中,确实不能直接使用Python原生的<<运算符对Expr对象进行移位操作,不过可以通过Polars内置的向量化表达式方法高效实现你需要的计算,完全不用依赖低效的lambda函数。
核心实现思路
- 类型转换:因为
val1是f32类型,val1 * 100的结果还是浮点数,而移位操作要求整数类型,所以先将其转换为足够大的整数类型(比如Int64,避免溢出)。 - 左移运算:使用Polars Expr的
shift_left()方法替代<<,这是底层由Rust实现的向量化操作,效率远高于Python层面的循环处理。如果需要检查移位是否溢出,可以用checked_shift_left()(对应你提到的Rust版CheckedShl)。 - 合并计算:将移位后的结果与
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
相关产品推荐
相关产品推荐

