4.4.1-数据框合并.md

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' 对应的数学成绩是?
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 的语文成绩。

  1. 【单选题·中】沿用上题代码,合并结果 cheng 的第 0 行(第一行)学号是? A. '203'(因为右侧表 shu 的第一行是 203) B. '201'(结果行序跟随左侧表 yu) C. '202' D. 无法确定,每次运行顺序随机 答案:B 解析: 课程输出第一行是学号 201、语文 91、数学 96,与左侧 yu 的行序一致,并不改成 shu 的 203、202、201。
  2. 【多选题·中】根据课程示例,合并后的数据框 cheng 中应包含哪些列? A. 学号 B. 语文 C. 数学 D. 分区 答案:ABC 解析: merge() 按学号把 yu(学号、语文)与 shu(学号、数学)合成新表,结果列为「学号、语文、数学」。「分区」是 4.3 分组示例中的列,本节没有。
  3. 【判断题·中】cheng = pd.merge(yu, shu, on='学号') 执行后,原数据框 yu 会被就地改写成三列(学号、语文、数学)。 答案:× 解析: merge() 生成新数据框并赋给 cheng,原来的 yu、shu 保持不变。要使用合并结果,应使用返回值。
  4. 【单选题·难】执行下列代码后,输出的三行「学号、语文、数学」依次是?
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 误以右侧表行序为准。

  1. 【简答题·中】请写出完整可运行代码:创建与课程相同的语文表 yu、数学表 shu,按「学号」合并为 cheng 并打印。再说明:学号 '203' 的语文、数学各是多少?为什么不是 91 和 94? 答案:
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 可酌情扣分。

  1. 【简答题·难】结合下列代码,回答三个问题:(1)merge() 的合并关键字是哪一列?结果生成了几行几列?(2)请按「学号 → 语文、数学」列出三名同学的匹配结果,并指出 shu 中数学列与学号的对应关系。(3)若有人把 on='学号' 改成按行号把两表左右拼在一起,201 的数学会被错写成多少?正确值是多少?
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)。只背输出、说不清对齐原理不得满分。

文件路径:

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

下载此文件