Pandas merge/join/concat的异同与SQL对照
请详细对比Pandas中pd.merge()、DataFrame.join()和pd.concat()的用法和适用场景。每种方法对应SQL中的什么操作?解释inner/outer/left/right join的区别,以及MultiIndex join的注意事项。
回答
Yahuda
核心区别:
| 方法 | 合并依据 | 轴方向 | 对应SQL |
|------|---------|--------|--------|
| merge() | 列或索引 | 横向(列增加) | JOIN |
| join() | 索引 | 横向(列增加) | 索引JOIN |
| concat() | 相同列/行 | 横向或纵向 | UNION ALL |
# merge (类似SQL JOIN)
pd.merge(df1, df2, on='key', how='inner')
pd.merge(df1, df2, left_on='lkey', right_on='rkey', how='outer')
# join (索引连接)
df1.join(df2, how='left') # 等价于 df1.merge(df2, left_index=True, right_index=True)
# concat (拼接)
pd.concat([df1, df2], axis=0) # 纵向追加行
pd.concat([df1, df2], axis=1) # 横向追加列
join类型:
inner:仅保留两表匹配的键(SQL INNER JOIN)outer:保留两表所有键,缺失填NaN(FULL OUTER JOIN)left:保留左表所有键(LEFT JOIN)right:保留右表所有键(RIGHT JOIN)
MultiIndex join:需指定on参数或left_index=True, right_index=True。
pd.merge(df1, df2, left_on=['k1', 'k2'], right_index=True)
常见陷阱:重复键导致笛卡尔积、列名冲突自动加_x/_y后缀、不同类型列join时隐式类型转换。