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

Polars跨列匹配值查询与性能对比及实现方案问询

Polars实现方案及性能优势

Polars在这类大数据集的重复条件更新操作上,性能远优于Pandas。核心原因是它采用列式存储、内置查询优化器,且支持向量化操作,避免了Pandas中merge带来的额外内存开销和计算冗余。

具体实现方法

1. Eager模式(即时执行)

直接通过is_in生成匹配掩码,再用with_columns完成条件赋值,全程向量化计算:

# 生成匹配掩码:Column A的值是否存在于Column B中
mask = df["Column A"].is_in(df["Column B"])

# 修改目标列(以Column C为例)
df_updated = df.with_columns(
    pl.when(mask)
    .then(pl.lit("updated_value"))  # 替换成你需要的修改值
    .otherwise(pl.col("Column C"))
    .alias("Column C")
)

2. Lazy模式(推荐重复操作场景)

对于需要重复执行10-30次的场景,用Polars的Lazy API可以先构建优化后的查询计划,后续重复执行无需重新优化,进一步降低耗时:

# 转为LazyFrame
lf = df.lazy()

# 定义查询逻辑(仅构建计划,未执行)
lf_updated = lf.with_columns(
    pl.when(pl.col("Column A").is_in(pl.col("Column B")))
    .then(pl.lit("updated_value"))
    .otherwise(pl.col("Column C"))
    .alias("Column C")
)

# 第一次执行(触发优化)
df_updated = lf_updated.collect()
# 后续重复执行,直接复用优化后的计划
for _ in range(29):
    df_updated = lf_updated.collect()

3. 多列修改

如果需要同时修改多列,只需在with_columns中添加多个条件赋值语句:

lf_updated = lf.with_columns(
    # 修改Column C
    pl.when(pl.col("Column A").is_in(pl.col("Column B")))
    .then(pl.lit("updated_c"))
    .otherwise(pl.col("Column C"))
    .alias("Column C"),
    # 修改Column D
    pl.when(pl.col("Column A").is_in(pl.col("Column B")))
    .then(pl.lit("updated_d"))
    .otherwise(pl.col("Column D"))
    .alias("Column D")
)

性能对比

针对30万-100万行、20列的数据集:

  • Pandas merge每次约0.5秒
  • Polars Eager模式每次耗时10-50毫秒
  • Polars Lazy模式重复执行时,后续每次耗时可进一步降低至5-20毫秒

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:37:22