# 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 的是哪一行？

```python
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 把“整组相同行”都当成重复，与默认规则不符。

7. 【单选题·中】沿用上题数据框，执行 `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'` 的结果。

8. 【多选题·中】沿用课程示例，比较两种删除方式，下列说法正确的有：

```python
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 错。

9. 【判断题·中】`df.drop_duplicates(keep='first')` 执行后，原始数据框 `df` 会变成 3 行。
   **答案：×**
   **解析：** 与 `dropna()` 类似，`drop_duplicates()` 返回新数据框，默认不修改原对象。原 `df` 仍是 4 行，必须把返回值赋给变量才能保存清洗结果。

10. 【单选题·难】执行下列代码，三处打印结果依次是？

```python
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` 的索引弄反了。

11. 【简答题·中】请写出完整可运行代码：按课程示例创建数据框，先检测重复行，再分别按保留第一行、保留最后一行删除重复值并打印。说明：哪一行会被 `duplicated()` 标为 True？两种删除结果的行标签有何不同？
   **答案：**

```python
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 可酌情扣分。

12. 【简答题·难】结合下列代码，回答三个问题：（1）为什么索引 1 是 False、索引 2 是 True？（2）`keep='first'` 与 `keep='last'` 留下的数值是否相同？行标签为什么不同？（3）若写成 `df[df.duplicated()]`，会得到哪几行？原 `df` 有没有被删行？

```python
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 行，不得满分。
