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

