pd.merge() 默认为内连接,但必须显式指定 how 参数(如 how='inner')以避免协作或阅读时出错;key列需dtype一致且列名明确匹配,多列合并用列表,复杂条件需预处理,同名列会自动加_x/_y后缀引发隐患。
merge() 默认是内连接,但得手动指定
参数才安全
很多人以为
不写
就是内连接,确实默认值是
,但靠默认值容易翻车——比如团队协作时别人改了默认行为(虽然 Pandas 不会这么干),或者自己看代码时漏读参数。实际用的时候,
、
这些必须显式写出来。
常见错误现象:
后行数比预期少,发现右表某些 key 在左表不存在,却没意识到这是内连接的天然行为;或者想保留左表全部记录,却忘了加
,结果默默变成内连接。
:只保留左右表 key 都存在的行,等价于 SQL 的
:以左表为基准,右表匹配不上就填
,等价于 SQL 的
和
也同理,但用得少;
是全外连接,SQL 里要写
on、left_on、right_on 容易配错列名或类型
合并失败最常见的原因是 key 列“看着一样,其实不能对上”。比如左表的
是字符串,右表的
是整数;或者两边都有
列,但拼写不一致(
vs
);又或者用了
却没确认两表是否有同名列。
使用场景:当左右表 join key 列名相同时,用
最简洁;名字不同时,必须拆开用
和
。
立即学习
“
Python免费学习笔记(深入)
”;
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
别依赖
自动推断——Pandas 不会猜你哪列该对齐,它只认你写的列名
合并前先检查
和
,字符串统一用
,数值统一用
如果 key 是多列,传列表:
,注意两边列顺序和含义要严格对应
merge() 没有 SQL 的 ON 条件扩展能力,复杂逻辑得先预处理
SQL 可以写
,但
的
/
只支持等值匹配,不支持不等式、函数或布尔表达式。想实现类似效果,得把条件挪到 merge 前后。
性能影响明显:在大表上先
过滤再 merge,比 merge 完再
快得多,因为减少了中间结果集大小。
想过滤右表再 join?先
,再 merge
想做范围 join(比如时间区间匹配)?
不行,得用
或手动
(慎用,爆炸性增长)
需要多条件等值(如 A=B 且 C=D)?确保这两对列都放进
列表,不要试图在
里写表达式
重复列名会自动加 _x / _y 后缀,但容易漏查冲突
如果左右表都有
、
这类同名列,
默认会给它们加上
(左表)和
(右表)后缀。这看起来方便,但问题在于:你可能根本没意识到某列被重命名了,后续代码还硬写
,结果报
。
兼容性影响:下游如果依赖固定列名(比如导出到数据库或传给另一个函数),这种自动改名就是隐患。
用
显式控制后缀,比默认的
更可读
合并后立刻检查
,尤其关注是否出现意料之外的
或
如果确定只要某一边的列,合并前先
掉另一侧的同名列,比如
事情说清了就结束。最常被忽略的是 dtype 不一致和后缀自动添加——这两个点不报错,但数据就 quietly 错了。
howpd.merge()how'inner'how='inner'how='left'merge()how='left'how='inner'INNER JOINhow='left'NaNLEFT JOINhow='right'how='outer'outerFULL OUTER JOINuser_ididname'Name''name'onon='col_name'left_on='left_col'right_on='right_col'ondf1['key'].dtypedf2['key'].dtype.astype(str).astype(int)on=['col_a', 'col_b']ON a.x = b.y AND b.status != 'deleted'pd.merge()onleft_onquery()query()df_right_filtered = df_right.query("status != 'deleted'")merge()pd.merge_asof()cross join + queryon=[...]onnamescoremerge()_x_ydf['score']KeyErrorsuffixes=('_left', '_right')_x/_yresult.columns_x_yselectdf_right = df_right.drop(columns=['name'])