4.4.2-合并方式.md

4.4.2 合并方式(问答库)

  1. 【单选题·易】使用 merge() 合并两个数据框时,决定合并类型的重要参数是? A. on B. how C. axis D. inplace 答案:B 解析: 语料明确:how 决定数据框合并的类型。on 指定合并关键字(4.4.1),axis 多用于 drop/concat,inplace 用于是否改原对象。
  2. 【单选题·易】内连接对应的 how 取值是什么?它是不是默认值? A. 'inner',是默认值 B. 'left',是默认值 C. 'outer',不是默认值 D. 'right',是默认值 答案:A 解析: 内连接 how 的值为 'inner',这也是默认值。省略 how 时效果与内连接相同。
  3. 【判断题·易】内连接只保留两个数据框中共同键值的行,只有键值匹配时才会出现在结果中。 答案:√ 解析: 这是内连接的定义。课程示例中只有两边都出现的学号 201 和 202 进入合并结果。
  4. 【判断题·易】左连接没有匹配时,右侧的数据用 0 填充。 答案:× 解析: 没有匹配时右侧用 NaN 填充,不是 0。课程中 203 号没有数学成绩,数学列为 NaN。
  5. 【多选题·中】下列属于 merge() 的 how 取值及对应连接方式的有: A. 'inner':内连接 B. 'left':左连接 C. 'right':右连接 D. 'concat':按行拼接 答案:ABC 解析: 四种类型是 inner、left、right、outer。concat 是下一节数据框连接的方法,不是 how 的取值。
  6. 【单选题·中】执行下列代码后,合并结果中包含哪些学号?
import pandas as pd
yu = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93]})
shu = pd.DataFrame({'学号': ['204', '202', '201'], '数学': [94, 85, 96]})
cheng = pd.merge(yu, shu, on='学号', how='inner')
print(list(cheng['学号']))

A. ['201', '202', '203'] B. ['201', '202'] C. ['201', '202', '203', '204'] D. ['204', '202', '201'] 答案:B 解析: 内连接只保留共同键。yu 有 201/202/203,shu 有 204/202/201,交集为 201 和 202。203 只在左表、204 只在右表,均被丢掉。A 是左连接的学号,C 是外连接,D 是右连接的行序。

  1. 【单选题·中】执行下列代码后,学号 203 对应的数学成绩是?
import pandas as pd
yu = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93]})
shu = pd.DataFrame({'学号': ['204', '202', '201'], '数学': [94, 85, 96]})
cheng = pd.merge(yu, shu, on='学号', how='left')
print(cheng)

A. 94 B. 缺失(NaN) C. 0 D. 93 答案:B 解析: 左连接保留左侧 yu 的全部行。203 只在 yu 中出现,shu 没有该学号,数学成绩用 NaN 填充。94 是 204 的数学;93 是 203 的语文。

  1. 【多选题·中】关于四种合并方式,下列说法正确的有: A. 内连接只保留两侧都出现的键 B. 左连接保留左表全部行,右表无匹配处填 NaN C. 外连接只保留两侧都不匹配的行 D. 右连接保留右表全部行,左表无匹配处填 NaN 答案:ABD 解析: 外连接保留两个数据框中的所有行(全部键),不是只保留不匹配的行,故 C 错误。匹配的行同样保留,缺侧再用 NaN 填充。
  2. 【判断题·中】pd.merge(yu, shu, on='学号') 省略 how 时,效果与 how='outer' 相同。 答案:× 解析: 默认值是 'inner' 而不是 'outer'。省略 how 会丢掉只在一侧出现的学号(如 203、204)。
  3. 【单选题·难】执行下列代码后,结果第一行的学号、学号 204 的语文、学号 201 的数学分别是?
import pandas as pd
yu = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93]})
shu = pd.DataFrame({'学号': ['204', '202', '201'], '数学': [94, 85, 96]})
cheng = pd.merge(yu, shu, on='学号', how='right')
print(cheng)

A. 204、NaN、96 B. 201、91、96 C. 204、93、94 D. 203、NaN、96 答案:A 解析: 右连接保留右侧 shu 的全部行,行序跟随 shu:204、202、201,故第一行学号是 204。204 在 yu 中不存在,语文为 NaN。201 按学号对齐到 shu 中的 96,不是按位置去取 shu 第一行的 94。

  1. 【简答题·中】写出 merge() 中 how 的四种取值,并分别说明各自保留哪些行、未匹配时如何处理。 答案: (1)'inner'(内连接,默认):只保留两个数据框中共同键值的行。 (2)'left'(左连接):保留左侧数据框的所有行;右侧无匹配则填 NaN。 (3)'right'(右连接):保留右侧数据框的所有行;左侧无匹配则填 NaN。 (4)'outer'(外连接):保留两个数据框中的所有行(全部键),缺少匹配的数据用 NaN 填充。 解析: 评分要点:① 四个取值 inner/left/right/outer 写全;② 能说明 inner 是默认、只留共同键;③ 能区分左/右是哪一侧为基准;④ 未匹配填 NaN 而非 0。写成 concat 或漏掉默认值可酌情扣分。
  2. 【简答题·难】结合下列代码,回答三个问题:(1)内连接结果有几行、包含哪些学号?学号 201 的数学是多少,为什么不是 94?(2)左连接中学号 203 的数学为什么是 NaN?(3)外连接比内连接多了哪些学号,缺的科目如何填充?
import pandas as pd
yu = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93]})
shu = pd.DataFrame({'学号': ['204', '202', '201'], '数学': [94, 85, 96]})
print(pd.merge(yu, shu, on='学号', how='inner'))
print(pd.merge(yu, shu, on='学号', how='left'))
print(pd.merge(yu, shu, on='学号', how='outer'))

答案: (1)内连接 2 行,学号为 201、202。201 的数学是 96。merge 按「学号」对齐,不是按行位置对齐:shu 中 204 对应 94、201 对应 96。 (2)左连接以 yu 为基准保留 201/202/203。203 只出现在 yu 中,shu 没有该学号,数学用 NaN 填充。 (3)外连接保留全部键,比内连接多出 203 和 204。203 无数学、204 无语文,均以 NaN 填充。 解析: 评分要点:① 内连接行数与学号正确,并能用按键对齐解释 96 而非 94;② 能说明 203 仅在左表故数学为 NaN;③ 能指出外连接多 203、204 且缺侧填 NaN。只背结果不讲对齐过程可酌情扣分。

下载此文件