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
相关产品推荐
相关产品推荐

