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
相关产品推荐
相关产品推荐

