如何在Polars中合并DataFrame,避免连接列重复显示?
解决Polars多列全外连接后连接列重复的问题
直接用on指定连接列,配合提前给非连接列加后缀的方式,就能一步得到符合要求的结果,完全不用手动去重:
步骤说明
- 对齐连接列名:确保两个DataFrame的连接列名称一致(如果不一致先重命名对齐)
- 给非连接列加区分后缀:左表非连接列加
_x,右表非连接列加_y - 执行全外连接:用
on指定连接列,Polars会自动只保留一组连接列,非连接列已经带好后缀不会冲突
代码示例
假设我们有两个带多连接列的DataFrame:
import polars as pl # 左表 df_left = pl.DataFrame({ "id": [1, 2, 3], "category": ["A", "B", "C"], "value": [10, 20, 30], "score": [85, 90, 78] }) # 右表 df_right = pl.DataFrame({ "id": [2, 3, 4], "category": ["B", "C", "D"], "value": [200, 300, 400], "rating": [4.5, 4.7, 4.2] }) # 定义连接列 join_cols = ["id", "category"] # 给左表非连接列加_x后缀 df_left_renamed = df_left.rename( {col: f"{col}_x" for col in df_left.columns if col not in join_cols} ) # 给右表非连接列加_y后缀 df_right_renamed = df_right.rename( {col: f"{col}_y" for col in df_right.columns if col not in join_cols} ) # 执行全外连接(join_nulls=True可保留连接列为空的行) final_df = df_left_renamed.join( df_right_renamed, on=join_cols, how="outer", join_nulls=True ) print(final_df)
关键注意点
- 必须用
on参数指定连接列,而非left_on/right_on,否则Polars会保留两边的连接列导致重复 - 提前重命名非连接列是处理大型DataFrame的高效方式,避免后续列操作的额外内存开销
- 如果不需要
_x/_y格式,也可以直接用join的suffix参数给右表重复列加后缀(比如suffix="_right"),左表非连接列保留原名
内容的提问来源于stack exchange,提问作者LukacsDominik1
相关产品推荐
相关产品推荐

