groupby() B. pd.merge() C. pd.concat() D. drop() 答案:C 解析: 语料明确:concat() 方法用于连接多个数据框。merge() 是 4.4.1 的按关键字合并,groupby 属于分组,drop 用于删除行或列。pd.concat([df1, df2], ignore_index=True) 时,参数 ignore_index=True 的作用是? A. 指定按「学号」对齐 B. 重建索引 C. 删除重复行 D. 把两表左右拼接成更多列 答案:B 解析: 课程说明:参数 ignore_index=True 用于重建索引。连接后行标签变为连续的 0、1、2…,而不是保留各表原来的索引。concat() 用于连接多个数据框。 答案:√ 解析: 4.4.3 开篇即指出:concat() 方法用于连接多个数据框。典型例子是把一个班两部分同学的成绩表拼成一张。pd.concat(df1, df2) 与 pd.concat([df1, df2]) 写法等价,都可以完成连接。 答案:× 解析: 课程写法是把数据框放进列表再传入,即 pd.concat([df1, df2], ignore_index=True)。直接写成两个位置参数不符合 concat() 的调用约定。pd.concat(),下列说法正确的有: A. 用于连接多个数据框 B. 第一个参数应是数据框组成的列表 C. ignore_index=True 用于重建索引 D. 作用与 merge() 完全相同,都按「学号」横向拼列 答案:ABC 解析: A、B、C 均来自 4.4.3 语料。merge() 按关键字合并字段,concat() 把多段记录上下拼接,二者不同,故 D 错误。cheng 一共有多少行?import pandas as pd
df1 = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93], '数学': [94, 85, 96]})
df2 = pd.DataFrame({'学号': ['204', '205', '206'], '语文': [95, 87, 83], '数学': [84, 75, 91]})
cheng = pd.concat([df1, df2], ignore_index=True)
print(cheng)
A. 3 行(只保留 df1) B. 3 行(只保留两表学号的交集,本例为空,实际 0 行) C. 6 行(df1 的 3 行接上 df2 的 3 行) D. 9 行(笛卡尔积) 答案:C 解析: concat() 沿行方向堆叠,不按学号求交。3+3=6 行,对应学号 201~206。B 把连接误当成了 merge() 的内连接。
'204' 对应的语文、数学成绩是? A. 语文 91、数学 94(误把 df1 第一行配给了 204) B. 语文 95、数学 84 C. 语文 87、数学 75 D. 语文 83、数学 91 答案:B 解析: '204' 来自 df2 第一行,语文 95、数学 84。87/75 是 205,83/91 是 206,91/94 是 201。连接按表的先后顺序堆叠,不按行号与另一表对齐。cheng 中应包含哪些列? A. 学号 B. 语文 C. 数学 D. 分区 答案:ABC 解析: df1 与 df2 都是「学号、语文、数学」,上下连接后列不变。「分区」是 4.3 分组示例中的列,本节没有。cheng = pd.concat([df1, df2], ignore_index=True) 执行后,原数据框 df1 会被就地改写成 6 行。 答案:× 解析: concat() 生成新数据框并赋给 cheng,原来的 df1、df2 保持不变。要使用连接结果,应使用返回值。list(cheng.index) 与 len(cheng.loc[0]) 分别是?import pandas as pd
df1 = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93], '数学': [94, 85, 96]})
df2 = pd.DataFrame({'学号': ['204', '205', '206'], '语文': [95, 87, 83], '数学': [84, 75, 91]})
cheng = pd.concat([df1, df2])
print(list(cheng.index))
print(len(cheng.loc[0]))
A. [0, 1, 2, 3, 4, 5] 与 1(即使未写 ignore_index 也会自动重建) B. [0, 1, 2, 0, 1, 2] 与 2(loc[0] 同时取出 201 和 204 两行) C. [0, 1, 2] 与 3(只保留 df1 的索引) D. 报错,因为索引重复 答案:B 解析: 未设置 ignore_index=True 时不重建索引,两表原来的 0、1、2 原样保留,出现重复标签。loc[0] 按标签取值,会得到学号 201 与 204 两行。课程强调该参数「用于重建索引」,正是为了避免这种情况。
df1、df2,用 concat() 连接为 cheng(重建索引)并打印。再说明:学号 '205' 的语文、数学各是多少?连接后第 0 行是谁? 答案:import pandas as pd
df1 = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93], '数学': [94, 85, 96]})
df2 = pd.DataFrame({'学号': ['204', '205', '206'], '语文': [95, 87, 83], '数学': [84, 75, 91]})
cheng = pd.concat([df1, df2], ignore_index=True)
print(cheng)
学号 '205' 的语文是 87、数学是 75。连接后第 0 行是 df1 的第一位同学,学号 '201'(语文 91、数学 94),因为列表中 df1 在前。 解析: 评分要点:① 学号写成字符串;② pd.concat([df1, df2], ignore_index=True);③ 205 对应 87 与 75;④ 能说明结果顺序跟随列表顺序。漏写列表括号或 ignore_index 可酌情扣分。
concat() 与 merge() 在本例中各会得到几行?为什么?(2)ignore_index=True 使结果的行标签变成什么?若去掉该参数,cheng.loc[0] 会取出哪些学号?(3)pandas 2.x 若要在已有成绩表末尾再追加一名同学,应如何使用 concat()?import pandas as pd
df1 = pd.DataFrame({'学号': ['201', '202', '203'], '语文': [91, 82, 93], '数学': [94, 85, 96]})
df2 = pd.DataFrame({'学号': ['204', '205', '206'], '语文': [95, 87, 83], '数学': [84, 75, 91]})
cheng = pd.concat([df1, df2], ignore_index=True)
print(cheng)
答案: (1)concat() 得到 6 行(两部分同学上下拼接)。merge() 按「学号」对齐,本例两表学号无交集,内连接(默认 how='inner')得到 0 行。连接加长行,合并拼字段,场景不同。 (2)重建后行标签为 0~5。去掉 ignore_index=True 后原索引保留为 0、1、2、0、1、2,cheng.loc[0] 会取出学号 '201' 和 '204' 两行。 (3)先把新行做成数据框,再与原表连接,例如 new_row = pd.DataFrame({'学号': ['207'], '语文': [88], '数学': [90]}),然后 df = pd.concat([cheng, new_row], ignore_index=True)。这与 4.1.2 中 pandas 2.x 追加新行的写法一致。 解析: 评分要点:① 能区分连接 6 行与按学号内连接 0 行;② 说明重建索引及漏写后 loc[0] 命中两行;③ 追加新行须先构造数据框再 concat。只背 6 行输出、说不清与 merge() 的差别不得满分。