# 4.4.1 数据框合并（问答库）
1. 【单选题·易】课程中用来合并两个数据框的函数是？
   A. `groupby()`
   B. `agg()`
   C. `pd.merge()`
   D. `drop()`
   **答案：C**
   **解析：** 语料明确：`merge()` 用来合并两个数据框。`groupby`/`agg` 属于分组聚合，`drop` 用于删除行或列。

2. 【单选题·易】调用 `pd.merge(yu, shu, on='学号')` 时，参数 `on` 的作用是？
   A. 指定要删除的列
   B. 指定合并关键字（两表据以对齐的共同列）
   C. 指定结果要保留的行索引
   D. 指定分隔符
   **答案：B**
   **解析：** 课程说明：参数 `on` 指定合并关键字。本例按「学号」列把两个数据框对齐合并。

3. 【判断题·易】`merge()` 将两个数据框按指定列合并后，生成一个新的数据框。
   **答案：√**
   **解析：** 语料：`merge()` 函数将两个数据框 `yu` 和 `shu` 按照学号列进行合并，生成一个新的数据框。

4. 【判断题·易】两个数据框中作为合并关键字的列，行顺序必须事先排成完全一致，否则 `merge()` 会报错。
   **答案：×**
   **解析：** 语料明确：数据框 `yu` 和 `shu` 中，学号列的顺序可以不同，pandas 能够自动对齐。

5. 【多选题·中】关于 `pd.merge()`，下列说法正确的有：
   A. 用来合并两个数据框
   B. 用参数 `on` 指定合并关键字
   C. 即使两表关键字列顺序不同，也能按键值自动对齐
   D. 作用与 `concat()` 完全相同，都是把表上下拼接
   **答案：ABC**
   **解析：** A、B、C 均来自 4.4.1 语料。`concat()` 是 4.4.3 数据框连接的方法，常用于上下拼接，与按关键字横向合并的 `merge()` 不同，故 D 错误。

6. 【单选题·中】执行下列代码后，学号 `'201'` 对应的数学成绩是？

```python
import pandas as pd
yu = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93]})
shu = pd.DataFrame({'学号': ['203', '202', '201'], '数学': [94, 85, 96]})
cheng = pd.merge(yu, shu, on='学号')
print(cheng)
```

   A. 94
   B. 85
   C. 96
   D. 91
   **答案：C**
   **解析：** pandas 按学号自动对齐，而不是按行号对齐。`shu` 中 `'201'` 对应数学 96（第三行），不是第一行的 94。91 是 201 的语文成绩。

7. 【单选题·中】沿用上题代码，合并结果 `cheng` 的第 0 行（第一行）学号是？
   A. `'203'`（因为右侧表 `shu` 的第一行是 203）
   B. `'201'`（结果行序跟随左侧表 `yu`）
   C. `'202'`
   D. 无法确定，每次运行顺序随机
   **答案：B**
   **解析：** 课程输出第一行是学号 201、语文 91、数学 96，与左侧 `yu` 的行序一致，并不改成 `shu` 的 203、202、201。

8. 【多选题·中】根据课程示例，合并后的数据框 `cheng` 中应包含哪些列？
   A. 学号
   B. 语文
   C. 数学
   D. 分区
   **答案：ABC**
   **解析：** `merge()` 按学号把 `yu`（学号、语文）与 `shu`（学号、数学）合成新表，结果列为「学号、语文、数学」。「分区」是 4.3 分组示例中的列，本节没有。

9. 【判断题·中】`cheng = pd.merge(yu, shu, on='学号')` 执行后，原数据框 `yu` 会被就地改写成三列（学号、语文、数学）。
   **答案：×**
   **解析：** `merge()` 生成新数据框并赋给 `cheng`，原来的 `yu`、`shu` 保持不变。要使用合并结果，应使用返回值。

10. 【单选题·难】执行下列代码后，输出的三行「学号、语文、数学」依次是？

```python
import pandas as pd
yu = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93]})
shu = pd.DataFrame({'学号': ['203', '202', '201'], '数学': [94, 85, 96]})
cheng = pd.merge(yu, shu, on='学号')
print(cheng)
```

   A. 201/91/94，202/82/85，203/93/96（按行号硬拼，未按学号对齐）
   B. 201/91/96，202/82/85，203/93/94（按学号对齐，行序跟随 `yu`）
   C. 203/93/94，202/82/85，201/91/96（行序跟随 `shu`）
   D. 201/91/96，202/82/94，203/93/85
   **答案：B**
   **解析：** 按学号匹配：201→语文91、数学96；202→82、85；203→93、94。结果行序与左侧 `yu` 相同。A 把 `shu` 第一行的 94 错配给了 201；C 误以右侧表行序为准。

11. 【简答题·中】请写出完整可运行代码：创建与课程相同的语文表 `yu`、数学表 `shu`，按「学号」合并为 `cheng` 并打印。再说明：学号 `'203'` 的语文、数学各是多少？为什么不是 91 和 94？
   **答案：**

```python
import pandas as pd
yu = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93]})
shu = pd.DataFrame({'学号': ['203', '202', '201'], '数学': [94, 85, 96]})
cheng = pd.merge(yu, shu, on='学号')
print(cheng)
```

   学号 `'203'` 的语文是 93、数学是 94。91 是 `'201'` 的语文，不是 203 的；pandas 按学号对齐而不是按行号拼接，所以不能把两表第 0 行直接配在一起。
   **解析：** 评分要点：① 学号写成字符串 `'201'` 等；② `pd.merge(..., on='学号')`；③ 203 对应 93 与 94；④ 能说明是按关键字对齐而非按行号对齐。学号写成整数或漏写 `on` 可酌情扣分。

12. 【简答题·难】结合下列代码，回答三个问题：（1）`merge()` 的合并关键字是哪一列？结果生成了几行几列？（2）请按「学号 → 语文、数学」列出三名同学的匹配结果，并指出 `shu` 中数学列与学号的对应关系。（3）若有人把 `on='学号'` 改成按行号把两表左右拼在一起，201 的数学会被错写成多少？正确值是多少？

```python
import pandas as pd
yu = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93]})
shu = pd.DataFrame({'学号': ['203', '202', '201'], '数学': [94, 85, 96]})
cheng = pd.merge(yu, shu, on='学号')
print(cheng)
```

   **答案：**
   （1）合并关键字是「学号」。结果 3 行 3 列（学号、语文、数学）。
   （2）201 → 语文 91、数学 96；202 → 82、85；203 → 93、94。`shu` 中数学与学号的对应为：203→94，202→85，201→96。
   （3）若按行号硬拼，`yu` 第 0 行（201）会配上 `shu` 第 0 行的数学 94，这是错误的；按学号对齐后 201 的正确数学成绩是 96。
   **解析：** 评分要点：① 关键字为学号、3 行 3 列；② 三名同学匹配及 `shu` 内部对应关系正确；③ 能对比「按行号」与「按关键字」的差异（94 与 96）。只背输出、说不清对齐原理不得满分。

文件路径：
- `知识库/第4章 pandas数据分析库/4.4.1-数据框合并.md`
- `问答库/第4章 pandas数据分析库/4.4.1-数据框合并.md`

本节只写 `merge()` + `on` 与自动对齐，未展开下一节的 `how`（内/左/右/外连接）和 `concat()`。题型覆盖单选/多选/判断/简答，共 12 题（易 4 / 中 6 / 难 2），简答 2 道。
