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

如何在Polars中以命名空间形式(如a.col1)选择关联后的列?

Polars中实现类似PySpark的列来源追踪方案

针对你想要在Polars中清晰区分关联操作列来源的需求,这里提供两种简洁的实现方案,避免手动加后缀或繁琐的结构体操作:

方案一:结构体包装(贴近PySpark别名写法)

通过一行代码将每个DataFrame的非连接键列打包成对应别名的结构体,后续选择列时可以直接用别名.列名的方式访问,和PySpark的写法逻辑一致:

import polars as pl

df1 = pl.DataFrame({
    "building_id": [1, 2, 3],
    "height": [10, 20, 30],
    "location": ["A", "B", "C"],
})

df2 = pl.DataFrame({
    "building_id": [2, 3, 4],
    "depth": [25, 35, 45],
    "year_built": [2000, 2010, 2020],
})

# 打包非连接键列为结构体,分别命名为a和b
joined_df = df1.with_columns(pl.exclude("building_id").alias("a")) \
               .join(df2.with_columns(pl.exclude("building_id").alias("b")), on="building_id", how="left")

# 按别名选择列,清晰追踪来源
result = joined_df.select(
    "building_id",
    pl.col("a.height"),
    pl.col("a.location"),
    pl.col("b.year_built")
)

print(result)

这种方式仅需一次结构体打包操作,后续列选择的语法和你期望的a.building_id几乎一致,多次转换后也能快速定位列的原始来源。

方案二:自动添加前缀(简洁高效)

利用Polars的prefix方法批量给非连接键列添加前缀,替代手动加后缀的繁琐操作,前缀相当于别名,直接通过前缀区分列来源:

import polars as pl

df1 = pl.DataFrame({
    "building_id": [1, 2, 3],
    "height": [10, 20, 30],
    "location": ["A", "B", "C"],
})

df2 = pl.DataFrame({
    "building_id": [2, 3, 4],
    "depth": [25, 35, 45],
    "year_built": [2000, 2010, 2020],
})

# 批量给非连接键列添加前缀
df1_aliased = df1.with_columns(pl.exclude("building_id").prefix("a_"))
df2_aliased = df2.with_columns(pl.exclude("building_id").prefix("b_"))

# 关联后直接按前缀选择列
result = df1_aliased.join(df2_aliased, on="building_id", how="left") \
                   .select(
                       "building_id",
                       "a_height",
                       "a_location",
                       "b_year_built"
                   )

print(result)

这种方案完全不需要结构体操作,代码简洁易读,前缀命名规则统一,适合列数量较多的场景。

内容的提问来源于stack exchange,提问作者Arend-Jan Tissing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:33:24