Polars DataFrame列与字符串变量计算相似度时触发AssertionError
解决Polars中Jaro-Winkler相似度计算的断言错误
错误原因
你直接调用jaro.jaro_winkler_metric时传入了Polars列表达式pl.col("first_name"),但这个库的函数只能处理单个Python字符串,无法识别Polars的列对象,所以触发了isinstance(s1, str)的断言错误。而且这种写法也不符合Polars的矢量化执行逻辑,Polars的表达式是懒执行的,需要用Polars支持的矢量化方法来处理列数据。
解决方案:使用Polars内置的Jaro-Winkler相似度函数
Polars从0.19.0版本开始内置了str.jaro_winkler_similarity方法,这是矢量化实现,性能远优于UDF,完全符合你的需求。
修改后的代码如下:
import polars as pl def test_polars(): name = 'savah' data = {"first_name": ['sarah', 'purnima'], "last_name": ['vats', 'malik']} df = pl.DataFrame(data) print(df) df = df.with_columns( pl.when(pl.col("first_name").str.jaro_winkler_similarity(name) >= 0.8) .then(1) .otherwise(0) .alias("COMP80_FN") ) print(df) if __name__ == '__main__': test_polars()
运行结果
执行后会输出:
shape: (2, 2) ┌────────────┬───────────┐ │ first_name ┆ last_name │ │ --- ┆ --- │ │ str ┆ str │ ╞════════════╪═══════════╡ │ sarah ┆ vats │ │ purnima ┆ malik │ └────────────┴───────────┘ shape: (2, 3) ┌────────────┬───────────┬──────────┐ │ first_name ┆ last_name ┆ COMP80_FN│ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i32 │ ╞════════════╪═══════════╪══════════╡ │ sarah ┆ vats ┆ 1 │ │ purnima ┆ malik ┆ 0 │ └────────────┴───────────┴──────────┘
注意事项
- 确保你的Polars版本≥0.19.0,如果版本过低,先升级:
pip install --upgrade polars - 这个内置方法默认的缩放因子是0.1,和
jaro库的默认参数一致,如果你需要调整缩放因子,可以传入参数,比如:pl.col("first_name").str.jaro_winkler_similarity(name, scaling_factor=0.2)
内容的提问来源于stack exchange,提问作者pbh
相关产品推荐
相关产品推荐

