如何在Polars表达式上下文中使用join操作?
问题
我有一个原始DataFrame和一个映射DataFrame,想把它们关联起来:
import polars as pl df = pl.DataFrame({ 'A': [1, 2, 3, 2, 1], }) mapper = pl.DataFrame({ 'key': [1, 2, 3, 4, 5], 'value': ['a', 'b', 'c', 'd', 'e'] })
我知道可以用df.join(mapper, ...)直接把A列映射到value列,但有没有办法在表达式上下文里完成这个操作?也就是在构建列的过程中实现,比如类似这样的写法:
df.with_columns( (pl.col('A')+1).join(mapper, left_on='A', right_on='key') )
预期得到的结果是:
shape: (5, 2) ┌─────┬───────┐ │ A ┆ value │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪═══════╡ │ 1 ┆ b │ │ 2 ┆ c │ │ 3 ┆ d │ │ 2 ┆ c │ │ 1 ┆ b │ └─────┴───────┘
解决方案
在Polars里,确实可以在表达式上下文完成这类映射,推荐两种高效的实现方式:
方法1:字典映射 + map_elements
先把映射DataFrame转成字典,再用map_elements在列表达式里完成值的映射:
# 将mapper转为键值对字典 map_dict = dict(zip(mapper['key'], mapper['value'])) result = df.with_columns( value=(pl.col('A') + 1).map_elements(lambda x: map_dict[x], return_dtype=pl.Utf8) ) print(result)
这种写法直观易懂,适合小规模数据集。
方法2:使用pl.lookup()(Polars 0.19.0+支持)
Polars提供了专门的lookup表达式,无需手动转字典,性能更优,是表达式上下文映射的首选方案:
result = df.with_columns( value=(pl.col('A') + 1).lookup(mapper, key='key', value='value') ) print(result)
该方法针对大数据集做了优化,执行效率远高于字典映射。
方法3:嵌套子查询实现类join逻辑
如果想贴合你示例中的join思路,也可以在with_columns里嵌套子查询完成关联,但这种写法不够简洁,一般不推荐:
result = df.with_columns( value=pl.select(pl.col('value')) .join(pl.select((pl.col('A') + 1).alias('key')), left_on='key', right_on='key') .select('value') ) print(result)
内容的提问来源于stack exchange,提问作者NedDasty
相关产品推荐
相关产品推荐

