如何在Polars中不依赖map_elements高效创建B_in_A列?
不依赖map_elements实现B_in_A列的可扩展方法
当然有,Polars提供了多种向量化字符串操作来替代逐行的map_elements,这些方法效率更高、代码更简洁,也更具可扩展性。以下是两种常用方案:
方案1:使用str.contains(推荐)
str.contains支持直接将另一列作为匹配模式,完全是向量化操作,性能远优于逐行处理:
import polars as pl df = pl.DataFrame({"A":["foo","bar","foo"],"B":["f","b","s"]}) df = df.with_columns( pl.col("A").str.contains(pl.col("B")).alias("B_in_A") ) print(df)
方案2:使用str.find判断匹配位置
str.find会返回子串的起始索引,若未找到则返回-1,通过判断索引是否不等于-1来得到布尔结果:
import polars as pl df = pl.DataFrame({"A":["foo","bar","foo"],"B":["f","b","s"]}) df = df.with_columns( (pl.col("A").str.find(pl.col("B")) != -1).alias("B_in_A") ) print(df)
以上两种方案都能得到和原代码完全一致的输出:
shape: (3, 3) ┌─────┬─────┬────────┐ │ A ┆ B ┆ B_in_A │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ bool │ ╞═════╪═════╪════════╡ │ foo ┆ f ┆ true │ │ bar ┆ b ┆ true │ │ foo ┆ s ┆ false │ └─────┴─────┴────────┘
为什么这些方法更优?
- 向量化执行:Polars会对整列数据批量处理,比
map_elements的逐行循环快几个数量级,尤其适合大数据集。 - 代码简洁:无需定义lambda函数,逻辑一目了然。
- 可扩展性强:可以轻松结合其他Polars操作(如过滤、分组),无需修改逐行处理的逻辑。
内容的提问来源于stack exchange,提问作者DataJack
相关产品推荐
相关产品推荐

