Left Join 用 pandas.merge(..., how="left"),需指定 on 或 left_on/right_on;Full Join 用 how="outer"而非"full";join() 默认按索引连接,易出错,推荐 merge()。

Left Join 怎么写?用 merge() 的 how="left"
直接用 pandas.merge(),关键在 how 参数。Left Join 就是保留左表全部行,右表只匹配上才填充,没匹配上的字段填 NaN。
常见错误是漏写 on 或 left_on/right_on —— 如果两表连接字段名不同,必须显式指定,不能指望自动推断。
-
df_left.merge(df_right, on="id", how="left"):字段名相同时最简写法 -
df_left.merge(df_right, left_on="user_id", right_on="id", how="left"):字段名不同时必须分开指定 - 如果左表有重复
id,结果行数会膨胀——这是正常行为,不是 bug
Full Join 怎么写?how="outer" 才对,别用 "full"
pandas.merge() 没有 how="full" 这个选项,用 how="outer" 才是 Full Join(即并集)。很多人搜 “pandas full join” 却输错参数,结果报 ValueError: how must be 'left', 'right', 'outer' or 'inner'。
注意:outer 会保留左右表所有 key,未匹配位置全填 NaN,但不会自动去重——如果某 key 在左右表都出现多次,结果里也会重复多次。
立即学习“Python免费学习笔记(深入)”;
-
df_a.merge(df_b, on="key", how="outer")是标准写法 - 若想按某个字段排序后再合并,先分别
sort_values("key"),否则合并后顺序不可控 - 合并后列名冲突(比如两边都有
name)会自动加_x/_y后缀,不能靠参数关掉
为什么 join() 不推荐用于 Left/Full Join?
DataFrame.join() 默认按 index 连接,不是按列——这和 SQL 的 Join 语义不一致,容易误用。除非你真把连接键设为了 index,否则用 merge() 更直观、更少出错。
典型坑:用 df1.join(df2, how="left"),结果发现行数不对或数据错位——大概率是因为 df2 的 index 和 df1 的 index 不对齐,而不是按某列匹配。
-
join()的how参数值和merge()一样("left","outer"),但连接依据是 index,不是列 - 想用
join()实现列连接?得先set_index("col"),再join(),最后reset_index()—— 多三步,没必要 - 性能上,
merge()对大表更可控,支持indicator=True查看每行来源("both"/"left_only"/"right_only")
实际写时最容易忽略的细节
连接前不检查缺失值和数据类型,合并后才发现 int 列变成 float(因为引入了 NaN),或者字符串里混着空格导致匹配失败。
- 用
df.dtypes确认连接字段类型一致,尤其objectvsstring(Pandas 1.0+ 推荐用string类型) - 连接字段含空值?
NaN不等于NaN,会导致本该匹配的行被漏掉——提前用fillna()或标记处理 - 大数据量时,
merge()默认不排序,但若后续要groupby或diff(),建议加sort=False显式声明,避免隐式开销
连接逻辑本身不难,难的是连接前的数据对齐和连接后的 NaN 处理——这两步漏掉,后面所有计算都可能出错。


















