CodeWalk

Pandas merge/join/concat的异同与SQL对照

作者:Yahuda · 2026-05-30 12:55

请详细对比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时隐式类型转换。