4. Pandas入门(上):Series与DataFrame创建、数据查看与筛选、数据清洗

各位同学,欢迎来到Pandas的世界。说实话,在量化交易这个行当里,Pandas就是我们的瑞士军刀。没有它,你连数据都拿不住,更别提什么策略回测了。今天咱们先打地基,把Series和DataFrame这两个核心数据结构搞明白。

本章核心脉络:从数据结构创建 → 数据查看与筛选 → 数据清洗(缺失值、重复值处理)

Pandas入门(上) 数据结构创建 数据查看与筛选 数据清洗 Series DataFrame head() / tail() loc / iloc 缺失值处理 重复值处理 三大模块层层递进,构建Pandas数据操作基础

4.1 数据结构创建:Series与DataFrame

先说说Series。你可以把它想象成一列带标签的数据,有点像Excel里的一列,但更灵活。我刚开始用Pandas时,总觉得Series有点多余——直接用列表不香吗?后来发现,有了索引标签,做数据对齐简直不要太爽。

import pandas as pd
import numpy as np

# 从列表创建Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

输出结果会显示索引(左边)和值(右边)。注意那个np.nan,它就是Pandas里的缺失值标记。嗯,这里要记住:Pandas用NaN表示缺失,不是None。

DataFrame就好理解了——它就是个表格。行和列都有标签。我个人习惯用字典来创建DataFrame,因为键名直接变成列名,特别直观。

# 从字典创建DataFrame
df = pd.DataFrame({
    '股票代码': ['000001', '000002', '000003'],
    '收盘价': [12.5, 8.3, 15.7],
    '成交量': [10000, 8500, 12000]
})
print(df)

小技巧:如果你有CSV文件,直接用pd.read_csv('文件路径.csv')就能读进来。我在项目中90%的数据都是这么来的。

4.2 数据查看与筛选

数据创建好了,第一件事就是看看它长什么样。别急着分析,先瞄一眼。

# 查看前5行
print(df.head())

# 查看后3行
print(df.tail(3))

# 查看基本信息
print(df.info())

# 查看统计摘要
print(df.describe())

head()tail()是我用得最频繁的两个函数。你想想看,每次拿到新数据,我第一反应就是df.head(),确认列名对不对、数据有没有乱码。

筛选数据这块,Pandas提供了两种方式:标签索引(loc)和位置索引(iloc)。

# loc:按标签名筛选
print(df.loc[0])           # 第一行
print(df.loc[:, '收盘价'])  # 所有行的'收盘价'列

# iloc:按位置筛选
print(df.iloc[0:2])        # 前两行
print(df.iloc[:, 1:3])     # 第1到第2列

注意:loc的切片是包含结束位置的,而iloc的切片是左闭右开。我曾经因为这个搞错过,查了半天才发现是索引方式的问题。

条件筛选也很常用。比如我只想看收盘价大于10的股票:

# 条件筛选
high_price = df[df['收盘价'] > 10]
print(high_price)

说白了,条件筛选就是给DataFrame一个布尔条件,它自动返回满足条件的行。这个在量化策略里太常用了——筛选出符合条件的股票,然后做进一步分析。

4.3 数据清洗:处理缺失值与重复值

真实数据从来不会干干净净。我遇到过最夸张的情况:一个CSV文件里30%的数据都是缺失的。所以数据清洗是必修课。

4.3.1 处理缺失值

先看看数据里有没有缺失值:

# 检查缺失值
print(df.isnull().sum())   # 每列缺失值数量
print(df.isnull().any())   # 哪些列有缺失

处理缺失值有两种思路:删除或填充。

# 删除包含缺失值的行
df_clean = df.dropna()

# 填充缺失值
df_filled = df.fillna(0)                    # 用0填充
df_filled_mean = df.fillna(df.mean())       # 用均值填充
df_filled_ffill = df.fillna(method='ffill') # 用前一个值填充

经验之谈:在量化交易中,我一般不用均值填充。因为金融数据有很强的时序性,用前一个值(ffill)或者插值法更合理。比如某天停牌导致数据缺失,用前一天的收盘价填充就很自然。

4.3.2 处理重复值

重复数据也是个麻烦事。有时候是数据源的问题,有时候是合并数据时搞出来的。

# 检查重复行
print(df.duplicated().sum())

# 删除重复行
df_unique = df.drop_duplicates()

# 按指定列判断重复
df_unique_subset = df.drop_duplicates(subset=['股票代码'])

我曾经在回测时发现收益率曲线特别漂亮,结果一查,原来是数据里有重复行,把同一笔交易算了两次。嗯,从那以后我每次做回测前都会先跑一遍drop_duplicates()

方法 用途 常用参数
isnull() 检测缺失值
dropna() 删除缺失值 axis, how, thresh
fillna() 填充缺失值 value, method, axis
duplicated() 检测重复值 subset, keep
drop_duplicates() 删除重复值 subset, keep, inplace

避坑指南:使用inplace=True时要小心。它直接修改原DataFrame,不会返回新对象。我建议先用inplace=False(默认)测试,确认没问题再改原数据。

好了,今天的内容就到这里。Series和DataFrame的创建、数据查看筛选、以及缺失值和重复值的处理,这些都是Pandas最基础的操作。别小看这些基础,我做了这么多年量化,每天还在用这些函数。下一章咱们会深入Pandas的高级操作,包括数据合并、分组聚合这些更强大的功能。


专注资料整理