如何用Polars中一个DataFrame的偏移信息提取另一个的子串列?
Polars优化子串提取方案(替代循环实现)
直接利用Polars的表达式批量生成能力,避免循环逐列处理,充分发挥向量化优势,代码更简洁高效:
1. 构造测试样例
import polars as pl # 示例字符串DataFrame df_strs = pl.DataFrame({ "Col_A": ["abcdefgh", "ijklmnop", "qrstuvwx"], "Col_B": ["12345678", "90123456", "78901234"] }) # 示例规则配置DataFrame df_offsets = pl.DataFrame({ "Reference_Col": ["Col_A", "Col_A", "Col_B"], "Offset": [2, 5, 1], "Length": [3, 2, 4], "Alias": ["A_sub1", "A_sub2", "B_sub1"] })
2. 优化实现代码
# 批量生成子串提取表达式 extract_exprs = [ pl.col(ref_col).str.slice(offset, length).alias(alias) for ref_col, offset, length, alias in df_offsets.rows() ] # 一次性添加所有新列 result_df = df_strs.with_columns(extract_exprs) # 查看结果 print(result_df)
3. 为什么这更符合Polars风格?
- 避免冗余拷贝:循环中多次调用
with_columns会生成多个中间DataFrame,而一次性传入所有表达式只需要一次计算,减少内存开销 - 向量化处理:Polars对批量表达式的处理是完全向量化的,比循环逐行/逐列处理性能高一个量级
- 代码更简洁:用列表推导式批量生成规则,逻辑一目了然,符合Polars声明式编程的设计思路
内容的提问来源于stack exchange,提问作者NedDasty
相关产品推荐
相关产品推荐

