深圳融克迪特科技有限公司 Logo,金融科技,量化交易,软件开发

深圳融克迪特科技有限公司

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

【pandas 系列 第4讲】处理缺失值

围绕收益率列首行空值这一最典型场景,练习缺失值统计、识别和最小清理动作,建立先看清问题再处理数据的基础习惯。

2026-04-23 智铨研究 阅读时长 5 分钟

目录

  1. 本节目标
  2. 为什么第 4 讲必须讲缺失值
  3. 沿用第 3 讲已有收益率列的工作表
  4. 四步处理缺失值
  5. 先统计每列空值数量
  6. 确认当前空值是不是“预期内的”
  7. 做一次最小删除处理
  8. 再次检查空值是否缩小
  9. 怎样判断本讲真的处理到位
  10. 原表确实能看到空值
  11. 清理后return列不再为空
  12. 清理后表仍然有数据
  13. 清理前后你能说出差异
  14. 缺失值是不是都该删掉
  15. 空值出现是不是就说明数据有问题
  16. 为什么这次直接删,而不是填充
  17. 如果别的列也有空值怎么办
  18. 处理完以后还要不要保留原表
  19. 哪些情况仍然算本讲完成
  20. 写一个最小缺失值处理函数
  21. 先记录,再删除
  22. 第 4 讲是在建立“先看再处理”的习惯
  23. 完成标准
  24. 系列衔接
  25. 风险揭示与免责声明

【pandas 系列 第4讲】处理缺失值

1. 本节目标

第 4 讲只解决一个非常现实的问题:表里出现空值以后,先怎么处理,才不会让后面的计算一路连锁出错。到第 3 讲为止,你手上的 work_df 已经有了 return 列,而它的第一行天然就会是空值。这正好是学习缺失值处理的最好入口。

学完这一讲后,你可以直接完成下面几件事:

  1. 知道哪些空值是“正常产物”,哪些空值值得警惕。
  2. 会用最小方式检查每列空值个数。
  3. 会做一次简单、可解释的缺失值处理。

2. 为什么第 4 讲必须讲缺失值

金融数据里空值并不稀奇。它可能来自原始数据缺失,也可能来自你自己新增列之后的自然结果。比如第 3 讲的收益率列第一行为空,就是一个最典型的例子。真正的问题不是“空值能不能完全消失”,而是:你知不知道这些空值从哪里来,以及现在该怎么处理它们

如果这一步跳过,后面的排序、均线和月份统计,很容易在你没注意的时候继续带着空值往下传,最后让结果变得难解释。

3. 沿用第 3 讲已有收益率列的工作表

print(work_df[['date', 'close', 'volume', 'return']].head())

现在最关键的是,你已经能在 return 列里看到至少一个非常典型的空值。第 4 讲就从这个最容易解释的例子开始。

4. 四步处理缺失值

第 4 讲最好不要跳步骤。先统计、再识别、后处理、最后复查,这样每一次删行都知道自己为什么删。

5. 先统计每列空值数量

print(work_df.isna().sum())

这是第 4 讲最先要养成的动作。不要一看到空值就立刻删,先数一遍每列到底有多少,问题才会变得具体。

6. 确认当前空值是不是“预期内的”

对当前这一讲来说,最常见的预期内空值,就是 return 第一行为空。你可以专门看它:

print(work_df[['date', 'return']].head())

这一步的意义在于,它能帮你区分“收益率首行为空”这种正常情况,和“中间大量缺失”这种更值得追问的情况。

7. 做一次最小删除处理

当前最朴素也最合适的做法,是直接把 return 为空的行先删掉:

clean_df = work_df.dropna(subset=['return']).copy()
print(clean_df.head())

对第 4 讲来说,这一步足够了。因为你现在最关心的是“后面还要继续用收益率列”,所以把 return 为空的行先去掉,是最容易解释的处理方式。

8. 再次检查空值是否缩小

print(clean_df.isna().sum())

处理完以后再数一遍,是为了确认你做的动作确实起了作用,而不是以为删掉了,实际上问题还在。

9. 怎样判断本讲真的处理到位

处理完缺失值以后,至少要能回答两个问题:空值是不是少了,以及删掉的到底是哪一类行。下面这几条检查就是围绕这两点展开的。

10. 原表确实能看到空值

assert work_df.isna().sum().sum() >= 1

11. 清理后return列不再为空

assert clean_df['return'].notna().all()

12. 清理后表仍然有数据

assert len(clean_df) > 0

13. 清理前后你能说出差异

print(work_df.shape)
print(clean_df.shape)

你应该能清楚说明:减少的那几行为什么会被删掉。

14. 缺失值是不是都该删掉

第一次处理空值时,最容易走向两个极端:全部删掉,或者一股脑全部填上。更稳的办法,是先分清空值来源,再决定动作。

15. 空值出现是不是就说明数据有问题

不一定。像 pct_change() 生成的首行空值,本来就是计算逻辑的一部分。

16. 为什么这次直接删,而不是填充

因为第 4 讲要先建立最朴素、最容易解释的处理方式。对收益率首行这种情况,直接删掉通常比硬填成 0 更稳。

17. 如果别的列也有空值怎么办

先分别统计、分别判断,不要把所有空值一股脑处理成同一种情况。第 4 讲最想训练的就是这种分层意识。

18. 处理完以后还要不要保留原表

建议保留。和前几讲一样,原表更像输入,中间清理后的 clean_df 才是接下来要继续用的工作表。

19. 哪些情况仍然算本讲完成

  1. 你只删了 return 为空的那一行,也完全可以。
  2. 若原表里还有别的少量空值,只要你已经识别出来,本讲也算有效推进。
  3. 当前不要求引入复杂填充策略。
  4. 你可以继续使用 clean_df 作为后面几讲的新起点。

20. 写一个最小缺失值处理函数

import pandas as pd

def drop_empty_returns(df: pd.DataFrame) -> pd.DataFrame:
    out = df.copy()
    return out.dropna(subset=['return'])

clean_df = drop_empty_returns(work_df)
print(clean_df.head())

21. 先记录,再删除

第 4 讲还有一个很值得保留的小习惯,就是在真正删除前,先把问题样本看一眼。哪怕只多写两行代码,也能让你的处理动作更可解释:

bad_rows = work_df[work_df['return'].isna()]
print(bad_rows)

这样做的好处是,你不会只知道“我删过数据”,而是能明确知道“我删掉的是哪几行、为什么删”。对入门者来说,这比一开始就追求更复杂的填充策略更重要。

22. 第 4 讲是在建立“先看再处理”的习惯

缺失值处理最容易犯的错,就是还没看清问题就先下手。第 4 讲要你先统计、再判断、最后处理,目的就是把这个顺序固定下来。以后你面对更复杂的空值场景,也还是沿着这条路径走,而不是凭感觉删。

23. 完成标准

如果你现在已经能先统计空值、明确 return 首行为空是正常结果、再把这类行干净地处理掉,那第 4 讲就算完成。

24. 系列衔接

本讲是《pandas金融数据入门短课》的第 4/8 讲,当前主题是《处理缺失值》。

上一讲:第 3 讲《新增收益率列》。

下一讲:第 5 讲《排序并重置索引》。

后续安排:第 6 讲《计算5日和10日均线》;第 7 讲《按月份统计平均收益》。

25. 风险揭示与免责声明

风险揭示与免责声明

本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。

本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。

市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。

读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。