# 4.6.1 缺失值检测与处理（问答库）

1. 【单选题·易】用来检测数据框中缺失值、返回布尔型数据框的方法是？
   A. `dropna()`
   B. `fillna()`
   C. `isna()` 或 `isnull()`
   D. `duplicated()`
   **答案：C**
   **解析：** 语料明确：`isna()` 或 `isnull()` 用来检测缺失值，返回布尔型数据框。`dropna()` 是删除，`fillna()` 是填充，`duplicated()` 属于重复值检测（4.6.3）。

2. 【单选题·易】关于 `df.isna()` 与 `df.isnull()`，下列说法正确的是？
   A. 前者只检测行，后者只检测列
   B. 两个函数的输出结果相同
   C. 只有 `isna()` 能用于数据框
   D. `isnull()` 会直接删除缺失值
   **答案：B**
   **解析：** 课程注释：`df.isna()` 与 `df.isnull()` 两个函数的输出结果相同。二者都只做检测，不删除、不填充。

3. 【判断题·易】`isna()` 返回的布尔型数据框中，`True` 对应的位置有缺失值。
   **答案：√**
   **解析：** 语料说明：True 对应的位置有缺失值。课程示例中二月的美好集团、北方通信和三月的广东科技为 True。

4. 【判断题·易】`dropna()` 默认会直接修改原始数据框，把含缺失值的行删掉。
   **答案：×**
   **解析：** `dropna()` 删除有缺失值的行并返回一个新数据框，默认不修改原始对象。要保留结果需赋值，如 `df2 = df.dropna()`。

5. 【多选题·中】下列属于课程中处理缺失值的常用方法的有：
   A. 使用 `dropna()` 删除包含缺失值的行或列
   B. 使用 `fillna()` 用特定值（如均值、中位数或前后值）填充
   C. 使用 `fillna(0)` 用 0 填充缺失值
   D. 使用 `drop_duplicates()` 删除重复行
   **答案：ABC**
   **解析：** 处理方式取决于分析需求。课程给出 `dropna()` 删除，以及 `fillna()` 用 0、前后值或列均值填充。`drop_duplicates()` 是 4.6.3 重复值处理，不是缺失值方法。

6. 【单选题·中】执行下列代码后，新数据框还剩下哪些行标签？

```python
import numpy as np
from pandas import DataFrame
a = np.array([[163, 113, 158],
              [np.nan, np.nan, 119],
              [193, 127, np.nan],
              [109, 126, 110]])
df = DataFrame(a, index=['一月', '二月', '三月', '四月'],
               columns=['美好集团', '北方通信', '广东科技'])
print(df.dropna())
```

   A. 一月、二月、三月、四月
   B. 一月、四月
   C. 二月、三月
   D. 仅一月
   **答案：B**
   **解析：** `dropna()` 默认删除有缺失值的行。二月美好集团与北方通信缺失，三月广东科技缺失，这两行被删，只保留完整的一月、四月。

7. 【单选题·中】执行下列代码后，二月「美好集团」的值是？

```python
import numpy as np
from pandas import DataFrame
a = np.array([[163, 113, 158],
              [np.nan, np.nan, 119],
              [193, 127, np.nan],
              [109, 126, 110]])
df = DataFrame(a, index=['一月', '二月', '三月', '四月'],
               columns=['美好集团', '北方通信', '广东科技'])
print(df.fillna(0).loc['二月', '美好集团'])
```

   A. `nan`
   B. `163.0`
   C. `0.0`
   D. `155.0`
   **答案：C**
   **解析：** `fillna(0)` 用 0 填充全部缺失值。二月美好集团原为缺失，填成 0.0。163.0 是前向填充结果，155.0 是列均值填充结果。

8. 【多选题·中】关于 `fillna()` 的填充策略，下列说法正确的有：
   A. `fillna(0)` 用 0 值填充缺失值
   B. `method='ffill'` 用缺失值前面的值填充
   C. `method='bfill'` 用缺失值前面的值填充
   D. `fillna(value=df.mean())` 用所在列的平均值填充
   **答案：ABD**
   **解析：** `ffill` 是前向填充（前面的值）；`bfill` 是用后面的值填充，故 C 错误。均值填充按列计算，不是全表一个数。

9. 【判断题·中】`df.fillna(method='ffill')` 指定用缺失值后面的值填充。
   **答案：×**
   **解析：** `method='ffill'` 用缺失值前面的值填充；用后面的值填充应指定 `method='bfill'`。较新版本 pandas 对应写法为 `df.ffill()` 与 `df.bfill()`。

10. 【单选题·难】执行下列代码后，二月「美好集团」、二月「北方通信」、三月「广东科技」的填充值分别是？

```python
import numpy as np
from pandas import DataFrame
a = np.array([[163, 113, 158],
              [np.nan, np.nan, 119],
              [193, 127, np.nan],
              [109, 126, 110]])
df = DataFrame(a, index=['一月', '二月', '三月', '四月'],
               columns=['美好集团', '北方通信', '广东科技'])
filled = df.fillna(value=df.mean())
print(filled.loc['二月', '美好集团'],
      filled.loc['二月', '北方通信'],
      filled.loc['三月', '广东科技'])
```

   A. `0.0`、`0.0`、`0.0`
   B. `163.0`、`113.0`、`119.0`
   C. `155.0`、`122.0`、`129.0`
   D. `193.0`、`127.0`、`110.0`
   **答案：C**
   **解析：** `fillna(value=df.mean())` 用所在列平均值填充。美好集团 (163+193+109)/3=155.0，北方通信 (113+127+126)/3=122.0，广东科技 (158+119+110)/3=129.0。A 是填 0，B 是前向填充，D 是后向填充。

11. 【简答题·中】写出检测缺失值的方法，并说明 `dropna()` 与 `fillna()` 各做什么；再列出课程中 `fillna()` 的三种填充方式。
   **答案：**
   （1）检测：`isna()` 或 `isnull()`，返回布尔型数据框，True 表示该位置缺失，二者结果相同。
   （2）`dropna()`：删除包含缺失值的行或列，默认删行并返回新数据框。
   （3）`fillna()`：用特定值填充缺失值。课程三种方式：`fillna(0)` 用 0 填充；`fillna(method='ffill')` 用前面的值（`bfill` 用后面的值）；`fillna(value=df.mean())` 用所在列平均值填充。
   **解析：** 评分要点：① 检测方法写全 isna/isnull 且说明结果相同、True 为缺失；② dropna 是删除、默认删行、返回新对象；③ fillna 三种策略（0 / 前后值 / 列均值）写清，ffill 与 bfill 方向不反。漏掉「返回新对象」或把 bfill 说成前面的值可酌情扣分。

12. 【简答题·难】结合下列代码，回答：（1）`isna()` 中哪些位置为 True？（2）`dropna()` 后剩下哪几行？（3）`fillna(0)`、前向填充、列均值填充时，二月「美好集团」分别变成多少？为什么三者不同？

```python
import numpy as np
from pandas import DataFrame
a = np.array([[163, 113, 158],
              [np.nan, np.nan, 119],
              [193, 127, np.nan],
              [109, 126, 110]])
df = DataFrame(a, index=['一月', '二月', '三月', '四月'],
               columns=['美好集团', '北方通信', '广东科技'])
print(df.isna())
print(df.dropna())
print(df.fillna(0))
print(df.ffill())  # 课程写法：df.fillna(method='ffill')
print(df.fillna(value=df.mean()))
```

   **答案：**
   （1）True 的位置：二月美好集团、二月北方通信、三月广东科技。
   （2）只剩一月、四月两行；二月、三月因含缺失被删。
   （3）填 0 得到 0.0；前向填充用一月的 163.0；列均值填充用美好集团非缺失均值 155.0。三者策略不同：常数填充、取同一列前一个有效值、按列统计后回填，所以结果不同。原 `df` 仍含缺失，因为这些方法默认都返回新对象。
   **解析：** 评分要点：① 三个缺失位置写全；② dropna 剩一月、四月；③ 三个填充值 0.0 / 163.0 / 155.0 正确，并能解释策略差异；④ 能指出默认不改原对象更佳。只背数字不讲原因可酌情扣分。

---

文件位置：
- 知识库：`知识库/第4章 pandas数据分析库/4.6.1-缺失值检测与处理.md`（正文约 480 字）
- 问答库：`问答库/第4章 pandas数据分析库/4.6.1-缺失值检测与处理.md`（12 题：单选/多选/判断/简答，易 4 / 中 6 / 难 2）

术语按语料使用「序列 / 数据框」。涉及数据的题目均带可运行代码；第 12 题前向填充写成 `df.ffill()`，与课程 `fillna(method='ffill')` 结果一致（pandas 3 已去掉 `fillna` 的 `method` 参数）。
