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

Polars中更快的Sequential Join实现方案问询

Polars实现顺序分组连接(Sequential Join)的高效方法

针对分组内存在重复值时,需要按行顺序逐一匹配而非生成笛卡尔积的需求,以下是比添加分组内索引更高效的实现方式,同时说明Polars的自定义连接支持情况:

高效实现方案

利用Polars的分组聚合+列表展开方式,避免逐行生成索引的开销,尤其适配大型数据集:

import polars as pl

dfA = pl.from_repr('''
┌───────┬─────┐
│ group ┆ A   │
│ ---   ┆ --- │
│ str   ┆ i64 │
╞═══════╪═════╡
│ X     ┆ 0   │
│ X     ┆ 1   │
│ Y     ┆ 2   │
│ Y     ┆ 3   │
└───────┴─────┘
''')

dfB = pl.from_repr('''
┌───────┬─────┐
│ group ┆ B   │
│ ---   ┆ --- │
│ str   ┆ i64 │
╞═══════╪═════╡
│ X     ┆ 4   │
│ X     ┆ 5   │
│ Y     ┆ 6   │
│ Y     ┆ 7   │
└───────┴─────┘
''')

# 按分组聚合为列表
agg_a = dfA.group_by("group").agg(pl.col("A").alias("A_list"))
agg_b = dfB.group_by("group").agg(pl.col("B").alias("B_list"))

# 连接后展开列表并恢复列名
result = agg_a.join(agg_b, on="group").explode(["A_list", "B_list"]).rename({"A_list": "A", "B_list": "B"})

print(result)

输出结果:

┌───────┬─────┬─────┐
│ group ┆ A   ┆ B   │
│ ---   ┆ --- ┆ --- │
│ str   ┆ i64 ┆ i64 │
╞═══════╪═════╪═════╡
│ X     ┆ 0   ┆ 4   │
│ X     ┆ 1   ┆ 5   │
│ Y     ┆ 2   ┆ 6   │
│ Y     ┆ 3   ┆ 7   │
└───────┴─────┴─────┘

该方案的核心优势:

  • 聚合为批量操作,比逐行生成分组索引的计算开销小,在分组数量多、数据量大时性能提升显著
  • 避免了索引列带来的额外存储和连接计算成本

Polars是否支持自定义连接逻辑?

目前Polars不支持直接添加自定义连接逻辑,所有内置连接类型(内连接、左连接等)均基于等值或范围匹配的标准逻辑。非标准连接行为只能通过分组聚合、窗口函数等间接方式实现。

内容的提问来源于stack exchange,提问作者T.H Rice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:55:08