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

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

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

【pandas 系列 第2讲】选列筛行:保留日期收盘价和成交量

把原始行情表缩成只保留日期、收盘价和成交量的工作表,练习最基础也最常用的选列与筛行动作,为后续收益率、均线和统计分析建立一张边界清晰的练习表。

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

目录

  1. 本节目标
  2. 为什么第 2 讲先练“选列筛行”
  3. 沿用第 1 讲的原始 DataFrame
  4. 四步得到一张精简工作表
  5. 先明确要保留哪些列
  6. 按列名选出精简表
  7. 做一个最小筛行动作
  8. 重新查看列名、前几行和形状
  9. 怎样判断本讲真的做完了
  10. 列名只剩三列
  11. 结果仍然是 DataFrame
  12. 关键列没有被筛空
  13. 行数没有意外变成 0
  14. 为什么这一步看着简单却总容易跳过
  15. 我直接在原表上算不行吗
  16. 为什么不保留open、high、low
  17. dropna后少了几行,是不是失败了
  18. 为什么一定建议copy()
  19. 哪些情况仍然算本讲完成
  20. 写成一个最小清理函数
  21. 第 2 讲其实是在建立“工作表”意识
  22. 完成标准
  23. 系列衔接
  24. 风险揭示与免责声明

【pandas 系列 第2讲】选列筛行:保留日期收盘价和成交量

1. 本节目标

第 2 讲只做一件非常实用的事:把第 1 讲读进来的整张行情表,压成一张只保留日期、收盘价和成交量的工作表。这一步看起来简单,但它决定了你后面做收益率、均线、缺失值处理时,是在一张清楚的练习表上继续推进,还是抱着一张原始大表一路硬算。

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

  1. 从原始行情表里挑出当前真正需要的列。
  2. 用最小筛选条件保留有效行。
  3. 得到一张后面还愿意继续拿来算指标的精简 DataFrame。

这就是 pandas 入门里最常见、也最值得尽早养成的动作之一:先缩表,再继续。

2. 为什么第 2 讲先练“选列筛行”

第 1 讲解决的是“我能把 CSV 稳定读进来吗”。到了第 2 讲,真正的问题变成:读进来以后,这张表是不是已经适合当前任务。现实里,原始表经常有很多列,但你当下并不需要全部字段。若你一直把所有字段都带着走,后面会遇到两个明显问题:

  1. 代码越来越长,但真正和当前任务有关的只有两三列。
  2. 一旦出现缺失值或类型问题,你很难迅速看出是哪个字段在拖累。

所以第 2 讲不是在教一个小技巧,而是在帮你建立一种工作顺序:先保留核心字段,再做后续处理。

3. 沿用第 1 讲的原始 DataFrame

本讲默认你已经完成第 1 讲,手上有一张名为 df 的行情表:

import pandas as pd

df = pd.read_csv('stock_daily_sample.csv')
print(df.head())

当前这张表通常至少有这些列:

第 2 讲不会把它全部丢掉,但会主动只保留当前最有用的三列。

4. 四步得到一张精简工作表

这四步分别对应定范围、取数据、去掉明显不可用的行,以及回头确认结果。顺着这个顺序做,后面继续加工会轻松很多。

5. 先明确要保留哪些列

本讲只保留:

  1. date,因为后面所有时序处理都离不开日期。
  2. close,因为收益率和均线通常都先从收盘价开始。
  3. volume,因为它是最常见的成交活跃度字段。

对应代码可以直接写成:

keep_cols = ['date', 'close', 'volume']

6. 按列名选出精简表

work_df = df[keep_cols].copy()
print(work_df.head())

这里建议一定加 copy()。目的很简单,就是把原始 df 和后面要反复修改的工作表分开,避免调试时互相干扰。

7. 做一个最小筛行动作

第 2 讲不做复杂筛选,只做一条最常见也最合理的规则:把 closevolume 为空的行先去掉。

work_df = work_df.dropna(subset=['close', 'volume'])
print(work_df.shape)

这样做的意义很直接。因为后面的收益率、均线和简单统计,都会依赖这两列。如果这一步就已经空着,后面的问题只会越来越大。

8. 重新查看列名、前几行和形状

print(work_df.columns.tolist())
print(work_df.head())
print(work_df.shape)

第 2 讲的目标不是“代码运行一下就算过”,而是你要明确确认:这张工作表已经只有你当前要用的列,并且仍然是一张结构正常的 DataFrame。

9. 怎样判断本讲真的做完了

验证不需要很复杂,只要把列、空值和行数三件事检查清楚,就足以判断这张表能不能继续往后用。

10. 列名只剩三列

assert work_df.columns.tolist() == ['date', 'close', 'volume']

11. 结果仍然是 DataFrame

assert isinstance(work_df, pd.DataFrame)

12. 关键列没有被筛空

assert work_df['close'].notna().all()
assert work_df['volume'].notna().all()

13. 行数没有意外变成 0

assert len(work_df) > 0

只要这四条都成立,你就已经得到了一张可以继续往第 3 讲传递的精简工作表。

14. 为什么这一步看着简单却总容易跳过

这一步最容易被忽略,不是因为它不重要,而是因为它看起来太基础。真实的数据处理里,越基础的整理动作,越能决定后面代码是不是清楚。

15. 我直接在原表上算不行吗

可以,但不稳。原表列多时,你会越来越难判断当前任务到底依赖哪几列。第 2 讲的核心就是把任务边界压清楚。

16. 为什么不保留open、high、low

这些列当然有用,只是这套入门短课后面几讲主要围绕收盘价、收益率、均线和聚合统计展开,所以先保留 dateclosevolume 最合适。

17. dropna后少了几行,是不是失败了

不一定。只要你明确知道为什么被删,且结果表仍然保留了有效样本,这通常是正常清理动作。

18. 为什么一定建议copy()

因为后面你会不断在 work_df 上新增列。如果不复制,原表和工作表之间的边界会变得模糊,调试时更容易混乱。

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

  1. 原始表行数很少,也没关系,只要筛选后还有有效数据就行。
  2. 你也可以额外保留 code,但如果这样做,得清楚它当前不是第 2 讲的核心列。
  3. 你不必在本讲就把 date 转成 datetime,第 2 讲主要先完成列和行的收窄。
  4. 若当前样本没有缺失值,dropna 后行数不变,完全正常。

20. 写成一个最小清理函数

import pandas as pd

def keep_core_market_cols(df: pd.DataFrame) -> pd.DataFrame:
    out = df[['date', 'close', 'volume']].copy()
    out = out.dropna(subset=['close', 'volume'])
    return out

work_df = keep_core_market_cols(df)
print(work_df.head())

这类函数非常适合作为你后面所有 pandas 入门练习的起点,因为它把“先缩表”这个动作固定住了。

21. 第 2 讲其实是在建立“工作表”意识

原始表不一定等于工作表。原始表更像输入材料,工作表则是你为了当前任务主动整理出来的一张中间表。第 2 讲最重要的收获,就是让你开始区分这两者。只要这个意识建立起来,后面新增收益率列、处理缺失值、排序和导出时,你都会更清楚自己是在操作哪一层数据。

22. 完成标准

如果你现在已经能把原始行情表稳定缩成一张只保留 dateclosevolume 的工作表,并知道为什么后面要继续基于它往下做,那第 2 讲就算完成。

23. 系列衔接

本讲是《pandas金融数据入门短课》的第 2/8 讲,当前主题是《选列筛行:保留日期收盘价和成交量》。

上一讲:第 1 讲《读取CSV:先看前5行行情》。

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

后续安排:第 4 讲《处理缺失值》;第 5 讲《排序并重置索引》。

24. 风险揭示与免责声明

风险揭示与免责声明

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

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

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

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