pandas 如何在 merge 时只保留左表所有行但右表匹配列

9次阅读

需指定how=”left”执行左连接,确保左表全量保留、右表仅匹配填充;键列名不同时用left_on/right_on;可预筛选右表列以精简结果;键重复时默认笛卡尔匹配,必要时需去重。

pandas 如何在 merge 时只保留左表所有行但右表匹配列

如果您使用 pandas 的 merge 操作,希望保留左表的全部行,同时仅将右表中能与左表匹配的列值填充进来,其余位置设为缺失值,则需明确指定合并类型为左连接。以下是实现该目标的具体方法:

一、使用 how=”left” 参数执行左连接

左连接(left join)确保左表所有行均保留在结果中,右表仅提供匹配键对应的列值;若右表无对应键,则结果中右表列填充 NaN。

1、导入 pandas 库:import pandas as pd

2、定义左表和右表 DataFrame,确保两表存在至少一个共同列名作为连接键,例如 “id”:

3、调用 pd.merge() 函数,显式传入 how=”left” 参数,并通过 on 指定连接键列名。

4、执行合并后,检查结果 DataFrame 的行数是否等于左表原始行数,验证左表完整性。

二、指定左右表连接键列名不一致时使用 left_on 与 right_on

当左表与右表用于匹配的列名不同时,不能直接使用 on 参数,而需分别指定左表匹配列与右表匹配列,避免因列名差异导致连接失败或误匹配。

1、确认左表中用于连接的列名,例如 “user_id”;

2、确认右表中用于连接的列名,例如 “uid”;

3、在 pd.merge() 中传入 left_on=”user_id”right_on=”uid”

4、仍需保留 how=”left” 以维持左表全量行。

三、限制右表仅保留特定列参与合并

为避免右表冗余列污染结果,可在 merge 前对右表进行列筛选,仅保留连接键及所需填充列,提升结果可读性与内存效率。

1、构造右表子集:使用双括号语法选取连接键列与目标列,例如 right_subset = right_df[[“uid”, “name”, “score”]]

2、将该子集传入 merge 函数的 right 参数;

3、同步调整 left_on 与 right_on 的列名参数,确保键列存在于子集中;

4、执行合并后,结果中仅含左表全部行与右表指定列的匹配值。

四、处理重复连接键时的默认行为说明

当左表或右表中连接键存在重复值时,merge 默认执行笛卡尔积式匹配,即左表某键每出现一次,就与右表所有同键行组合生成新行。该行为可能导致结果行数显著增加,但依然满足“保留左表所有行”的要求。

1、检查左表连接键列是否含重复值:left_df[“id”].duplicated().any()

2、检查右表连接键列是否含重复值:right_df[“id”].duplicated().any()

3、若需规避笛卡尔扩展,应在 merge 前对右表按连接键去重,例如 right_df.drop_duplicates(subset=[“id”], keep=”first”)

4、将去重后的右表传入 merge 调用。

text=ZqhQzanResources