You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:15:53