4.6.3-重复值检测与处理.md

4.6.3 重复值检测与处理(问答库)

  1. 【单选题·易】课程中用来检测数据框重复行的函数是? A. isna() B. duplicated() C. dropna() D. astype() 答案:B 解析: 语料明确:duplicated() 函数用于检测数据中的重复值。isna()/dropna() 属于缺失值,astype() 属于类型转换。
  2. 【单选题·易】drop_duplicates() 的作用是? A. 检测缺失值并返回布尔数据框 B. 按分位数识别异常值 C. 删除重复值,可选择保留第一行或最后一行 D. 把序列转换成指定数据类型 答案:C 解析: 语料:drop_duplicates() 函数用于删除重复值。可选择保留第一行或最后一行,对应 keep='first' 与 keep='last'。
  3. 【判断题·易】duplicated() 会返回一个布尔类型的序列对象,指示每一行是否为重复行。 答案:√ 解析: 语料原句:该函数会返回一个布尔类型的序列对象,指示每一行是否为重复行。注意返回的是序列,不是数据框。
  4. 【判断题·易】duplicated() 通常保留第一次出现的值,后续重复的值会标记为 True。 答案:√ 解析: 这是课程对 duplicated() 默认规则的说明。第一次出现为 False,后面相同的行才为 True。
  5. 【多选题·中】关于重复值检测与处理,下列说法正确的有: A. 处理重复值是数据清洗的重要步骤,可避免冗余数据影响分析结果 B. duplicated() 返回布尔类型的序列 C. drop_duplicates(keep='first') 保留第一行 D. drop_duplicates(keep='last') 会把所有行全部删掉 答案:ABC 解析: A、B、C 均来自 4.6.3 语料。keep='last' 是保留最后一次出现的重复行,不是删光全部行,故 D 错误。
  6. 【单选题·中】执行下列代码后,被标记为 True 的是哪一行?
from pandas import DataFrame
data = {'A': [1, 2, 2, 3], 'B': [4, 5, 5, 6]}
df = DataFrame(data)
print(df.duplicated())

A. 索引 0(第一行 1、4) B. 索引 1(第一次出现的 2、5) C. 索引 2(后续出现的 2、5) D. 索引 1 和 2 同时为 True 答案:C 解析: 第 1 行与第 2 行数据相同,但通常保留第一次出现,只有后续重复行标 True。语料注释:索引 2 这一行被标记为重复行。D 把“整组相同行”都当成重复,与默认规则不符。

  1. 【单选题·中】沿用上题数据框,执行 df.drop_duplicates(keep='first') 后,结果的行标签是? A. 0, 1, 2, 3(一行都没删) B. 0, 1, 3 C. 0, 2, 3 D. 0, 3 答案:B 解析: keep='first' 保留第一次出现的 (2, 5),即索引 1,删除后续的索引 2。留下 0、1、3 三行。0, 2, 3 是 keep='last' 的结果。
  2. 【多选题·中】沿用课程示例,比较两种删除方式,下列说法正确的有:
from pandas import DataFrame
data = {'A': [1, 2, 2, 3], 'B': [4, 5, 5, 6]}
df = DataFrame(data)
print(df.drop_duplicates(keep='first'))
print(df.drop_duplicates(keep='last'))

A. keep='first' 留下行标签 0、1、3 B. keep='last' 留下行标签 0、2、3 C. 两种结果中,中间那行的 A、B 都是 2 和 5 D. 两种结果的行标签完全相同 答案:ABC 解析: 语料注释:保留第一行时序号为 1,保留最后一行时序号为 2,重复行数据相同、序号不同。因此 C 对、D 错。

  1. 【判断题·中】df.drop_duplicates(keep='first') 执行后,原始数据框 df 会变成 3 行。 答案:× 解析: 与 dropna() 类似,drop_duplicates() 返回新数据框,默认不修改原对象。原 df 仍是 4 行,必须把返回值赋给变量才能保存清洗结果。
  2. 【单选题·难】执行下列代码,三处打印结果依次是?
from pandas import DataFrame
data = {'A': [1, 2, 2, 3], 'B': [4, 5, 5, 6]}
df = DataFrame(data)
print(bool(df.duplicated().loc[2]))
print(list(df.drop_duplicates(keep='first').index))
print(df.drop_duplicates(keep='last').loc[2, 'A'])

A. True,[0, 1, 3],2 B. False,[0, 1, 3],2 C. True,[0, 2, 3],2 D. True,[0, 1, 3],1 答案:A 解析: duplicated() 在索引 2 处为 True。keep='first' 行标签为 0、1、3。keep='last' 保留的 (2, 5) 行标签是 2,该行 A 列仍是 2,不是 1。C 把两种 keep 的索引弄反了。

  1. 【简答题·中】请写出完整可运行代码:按课程示例创建数据框,先检测重复行,再分别按保留第一行、保留最后一行删除重复值并打印。说明:哪一行会被 duplicated() 标为 True?两种删除结果的行标签有何不同? 答案:
from pandas import DataFrame
data = {'A': [1, 2, 2, 3], 'B': [4, 5, 5, 6]}
df = DataFrame(data)
print(df.duplicated())
print(df.drop_duplicates(keep='first'))
print(df.drop_duplicates(keep='last'))

duplicated() 把索引 2 标为 True(后续出现的 A=2、B=5)。keep='first' 行标签为 0、1、3;keep='last' 行标签为 0、2、3。重复行数据相同,序号不同。 解析: 评分要点:① 示例数据与 DataFrame 创建正确;② 写出 duplicated()、keep='first'、keep='last';③ 指出索引 2 为 True;④ 能对比两种行标签。漏写 keep 或把第 1 行也当成 True 可酌情扣分。

  1. 【简答题·难】结合下列代码,回答三个问题:(1)为什么索引 1 是 False、索引 2 是 True?(2)keep='first' 与 keep='last' 留下的数值是否相同?行标签为什么不同?(3)若写成 df[df.duplicated()],会得到哪几行?原 df 有没有被删行?
from pandas import DataFrame
data = {'A': [1, 2, 2, 3], 'B': [4, 5, 5, 6]}
df = DataFrame(data)
print(df.duplicated())
print(df.drop_duplicates(keep='first'))
print(df.drop_duplicates(keep='last'))
print(df[df.duplicated()])

答案: (1)第 1 行与第 2 行都是 A=2、B=5。duplicated() 通常保留第一次出现,所以索引 1 为 False;后续重复才标 True,所以索引 2 为 True。 (2)留下的 A、B 取值相同(都是 1/4、2/5、3/6)。差别只在中间那行的序号:keep='first' 保留索引 1,keep='last' 保留索引 2。 (3)布尔索引选出被标为 True 的行,只得到索引 2 那一行(A=2、B=5)。这只是筛选视图/新结果,drop_duplicates() 也返回新对象,原 df 仍是 4 行,没有就地删行。 解析: 评分要点:① 能用“保留第一次、后续标 True”解释 1 与 2 的布尔值;② 能说出数据相同、序号不同;③ 能说明 df[df.duplicated()] 只含索引 2,且原对象不变。把索引 1、2 都说成 True,或认为原 df 已被改成 3 行,不得满分。

下载此文件