# 4.4.2 合并方式

`merge()` 方法用来将两个数据框合并成一个。使用 `merge()` 合并时，一个重要参数是 `how`，它决定了数据框合并的类型。课程示例用语文成绩表 `yu` 与数学成绩表 `shu`：`yu` 含学号 201、202、203，语文成绩分别为 91、82、93；`shu` 含学号 204、202、201，数学成绩分别为 94、85、96。与 4.4.1 不同，本节 `shu` 用 204 替换了 203，两侧键不完全重合，才能比较各种连接方式。合并关键字仍用 `on='学号'`。

四种类型如下。（1）内连接只保留两个数据框中共同键值的行。也就是说，只有当两个数据框的键值匹配时，才会在结果中显示这行数据。`how` 的值为 `'inner'`，这也是默认值。`pd.merge(yu, shu, on='学号', how='inner')` 的结果只有学号 201 和 202，语文/数学分别为 91/96 与 82/85。（2）左连接保留左侧数据框中的所有行，右侧数据框只有与左侧匹配的行会出现在结果中。如果没有匹配，则右侧的数据用 NaN 填充。`how` 的值为 `'left'`。结果保留 `yu` 的全部三行，203 号没有数学成绩，数学列为 NaN。（3）右连接与左连接相反，它保留右侧数据框的所有行，左侧数据框只有匹配的行会出现在结果中。如果没有匹配，则左侧的数据用 NaN 填充。`how` 的值为 `'right'`。结果保留 `shu` 的三行，行序为 204、202、201，204 号没有语文成绩，语文列为 NaN。（4）外连接保留两个数据框中的所有行，缺少匹配的数据会用 NaN 填充。这种方式合并所有键的值，不管是否匹配。`how` 的值为 `'outer'`。结果含 201、202、203、204 四行：203 号没有数学成绩，204 号没有语文成绩，均以 NaN 填充。

实际选用时：需要“两边都有才保留”用内连接；以某张表为基准补另一科成绩用左连接或右连接；要保留全部学号用外连接。易错点：省略 `how` 等同于内连接，会丢掉只在一侧出现的学号（203、204）；左、右是相对于 `merge` 的参数顺序，写在前面的是左表；未匹配处填充 NaN，该列可能变为浮点数（如 96.0）；不要把四种 `how` 与下一节用 `concat()` 按轴拼接数据框混为一谈。

## 关键要点
- `merge()` 将两个数据框按关键字合并；`how` 决定合并类型。
- 内连接 `how='inner'`（默认）：只保留两侧共同键值的行。
- 左连接 `how='left'`：保留左表全部行，右表无匹配处填 NaN。
- 右连接 `how='right'`：保留右表全部行，左表无匹配处填 NaN。
- 外连接 `how='outer'`：保留两侧全部行（全部键），缺侧填 NaN。
- 课程示例中共同学号为 201、202；203 仅在 `yu`，204 仅在 `shu`。
- `merge` 按键对齐，不要与 `concat()` 的轴拼接混淆。
