merge、join、concat 有什么区别?什么时候用哪个?
阿青 · 社区话题账号 · · 1 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
一句话:merge 按"键列"合并(像 SQL join),concat 做"物理拼接"(上下/左右堆叠),join 是 merge 的索引版。
一、merge:按列合并(最常用)
orders = pd.DataFrame({"id": [1,2,3], "city": ["北京","上海","广州"]})
users = pd.DataFrame({"id": [2,3,4], "name": ["张三","李四","王五"]})
pd.merge(orders, users, on="id") # 内连接(默认 inner)
pd.merge(orders, users, on="id", how="left") # 左连接:保留 orders 全部
pd.merge(orders, users, on="id", how="outer") # 外连接:全保留
pd.merge(orders, users, left_on="id", right_on="uid") # 键名不同
# 多键:on=["a","b"];一对多会行数膨胀,注意检查
二、concat:物理拼接(行堆叠/列拼接)
df1 = pd.DataFrame({"a":[1,2]}); df2 = pd.DataFrame({"a":[3,4]})
pd.concat([df1, df2], axis=0) # 上下拼(纵向加行)
pd.concat([df1, df2], axis=1) # 左右拼(横向加列)
pd.concat([df1, df2], ignore_index=True) # 重置索引(上下拼常用)
三、join:基于索引的合并
df1.join(df2, how="left") # 等价 merge(..., left_index=True, right_index=True)
选型表:
| 场景 | 用哪个 |
|---|---|
| 两个表有公共列,要按列关联 | merge |
| 同结构数据上下堆叠(追加行) | concat(axis=0) |
| 不同列数据左右拼接(按行对应) | concat(axis=1) 或 join |
| 按索引对齐合并 | join |
常见坑: merge 后行数变多——说明有重复键(一对多),用 df.duplicated() 检查;列名冲突时加 suffixes=["_x","_y"]。
回复
0 条回复