如何在Polars中通过两列相除创建新列?含LazyFrame高效方案
Polars实现两列相除生成新列(含LazyFrame最优方案)
问题背景
在Pandas中可直接通过两列相除为DataFrame创建新列,如何在Polars中实现相同操作?同时希望获取Polars.LazyFrame的最快实现方式。
Pandas参考实现
import polars as pl df = pl.DataFrame({"col1":[10,20,30,40,50], "col2":[5,2,10,10,25]}) df_pd = df.to_pandas() df_pd["ans"] = df_pd["col1"] / df_pd["col2"] print(pl.from_pandas(df_pd))
预期输出
┌──────┬──────┬──────┐ │ col1 ┆ col2 ┆ ans │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ f64 │ ╞══════╪══════╪══════╡ │ 10 ┆ 5 ┆ 2.0 │ │ 20 ┆ 2 ┆ 10.0 │ │ 30 ┆ 10 ┆ 3.0 │ │ 40 ┆ 10 ┆ 4.0 │ │ 50 ┆ 25 ┆ 2.0 │ └──────┴──────┴──────┘
Polars实现方案
1. Eager模式(即时计算)
Polars的Eager模式可通过with_columns或assign方法直接添加计算后的新列,写法简洁直观:
import polars as pl df = pl.DataFrame({"col1":[10,20,30,40,50], "col2":[5,2,10,10,25]}) # 方式1:使用列表达式定义计算逻辑 df = df.with_columns((pl.col("col1") / pl.col("col2")).alias("ans")) print(df) # 方式2:类似Pandas的assign语法 df = df.assign(ans=pl.col("col1") / pl.col("col2")) print(df)
2. LazyFrame模式(最优性能方案)
Polars的Lazy模式会先构建查询计划并自动优化,是大数据量场景下的最快实现方式。核心步骤为:创建/转换为LazyFrame → 定义列计算 → 执行收集结果:
import polars as pl # 直接创建LazyFrame lf = pl.LazyFrame({"col1":[10,20,30,40,50], "col2":[5,2,10,10,25]}) # 构建查询计划并执行计算 result = lf.with_columns((pl.col("col1") / pl.col("col2")).alias("ans")).collect() print(result)
若已有Eager DataFrame,可通过.lazy()方法快速转换为LazyFrame:
df = pl.DataFrame({"col1":[10,20,30,40,50], "col2":[5,2,10,10,25]}) lf = df.lazy() result = lf.with_columns((pl.col("col1") / pl.col("col2")).alias("ans")).collect() print(result)
两种模式均能得到与预期一致的输出,其中LazyFrame模式借助Polars查询优化器(如谓词下推、列裁剪等),在处理大规模数据时能显著提升执行效率。
内容的提问来源于stack exchange,提问作者user17260574
相关产品推荐
相关产品推荐

