4. Pandas基础:Series与DataFrame的创建、数据读取与预览

做量化分析,说白了就是跟数据打交道。而Pandas,就是咱们手里最顺手的工具。我刚开始接触量化的时候,面对一堆CSV文件,头都是大的。后来发现,只要把Pandas的Series和DataFrame搞明白,后面的事情就顺了。

这一章,咱们就聊聊这两个核心数据结构。别怕,其实很简单。

4.1 认识Series:一维数据的好帮手

Series,你可以把它想象成一个带标签的列表。每个数据都有一个对应的索引,就像Excel里的一列数据,但比那灵活多了。

创建Series

最直接的方式,就是从列表创建:

import pandas as pd

# 从列表创建Series
s = pd.Series([100, 200, 300, 400, 500])
print(s)

输出结果会显示索引(左边)和值(右边)。默认索引是从0开始的整数。

但咱们做机构持仓分析,索引往往是有意义的。比如用股票代码做索引:

# 指定索引
s = pd.Series([100, 200, 300], index=['000001.SZ', '600001.SH', '300001.SZ'])
print(s)
我的小习惯: 创建Series时,我习惯把索引设成有业务含义的字段。比如股票代码、日期等。这样后面做筛选、合并的时候,一眼就能看出数据代表什么。

从字典创建

字典的键会自动变成索引:

# 从字典创建
data = {'贵州茅台': 1850.50, '五粮液': 168.20, '泸州老窖': 220.30}
s = pd.Series(data)
print(s)

嗯,这里要注意:字典是无序的,但Series会保持你传入的顺序。

4.2 DataFrame:二维表格的核心

DataFrame才是咱们真正的主力。它就像一张Excel表格,有行有列。每一列可以看作一个Series。

创建DataFrame

最常用的方式是从字典创建,每个键是一列:

# 创建DataFrame
data = {
    '股票代码': ['000001.SZ', '600001.SH', '300001.SZ'],
    '股票名称': ['平安银行', '浦发银行', '宁德时代'],
    '收盘价': [12.50, 8.30, 450.00],
    '持仓市值': [1250000, 830000, 45000000]
}
df = pd.DataFrame(data)
print(df)

你看,这样数据就结构化了。每一行是一只股票,每一列是一个属性。

实战经验: 我在做机构持仓分析时,DataFrame的列通常包括:股票代码、股票名称、持仓数量、持仓市值、占净值比例、所属行业等。这些字段后面都会用到。

从列表嵌套创建

有时候数据是从API接口拿到的,是列表嵌套列表的形式:

# 从列表嵌套创建
data = [
    ['000001.SZ', '平安银行', 12.50],
    ['600001.SH', '浦发银行', 8.30],
    ['300001.SZ', '宁德时代', 450.00]
]
df = pd.DataFrame(data, columns=['股票代码', '股票名称', '收盘价'])
print(df)

4.3 数据读取:CSV和Excel

实际工作中,数据很少手动输入。大部分是从CSV或Excel文件读取的。

读取CSV文件

这是最常用的方式。机构持仓数据很多都是CSV格式:

# 读取CSV文件
df = pd.read_csv('fund_holdings.csv')
print(df.head())

但CSV文件经常有坑。我曾经遇到过编码问题,文件明明是UTF-8编码,但读出来全是乱码。后来我养成了一个习惯:

# 指定编码,避免乱码
df = pd.read_csv('fund_holdings.csv', encoding='utf-8')

# 如果还不行,试试gbk
# df = pd.read_csv('fund_holdings.csv', encoding='gbk')
避坑指南: 我曾经因为CSV文件里有多余的空行,导致数据读取后多了一行NaN。后来发现加上 skip_blank_lines=True 就能解决。另外,如果文件里有注释行,可以用 comment='#' 跳过。

读取Excel文件

有些数据源喜欢用Excel格式。读取Excel需要安装 openpyxlxlrd 库:

# 读取Excel文件
df = pd.read_excel('fund_holdings.xlsx', sheet_name='Sheet1')
print(df.head())

Excel文件里经常有多个sheet。我一般会先看看有哪些sheet:

# 查看所有sheet名称
xls = pd.ExcelFile('fund_holdings.xlsx')
print(xls.sheet_names)

4.4 数据预览与基本信息查看

数据读进来了,第一件事不是急着分析,而是先看看数据长什么样。

查看前几行

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

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

# 指定行数
print(df.head(10))

查看基本信息

# 查看数据信息
print(df.info())

info() 会告诉你:有多少行、多少列、每列的数据类型、有没有缺失值。这个函数我几乎每天都会用。

查看统计摘要

# 查看数值列的统计信息
print(df.describe())

这会显示每列的数量、均值、标准差、最小值、最大值等。对于发现异常值很有帮助。

我的习惯: 拿到数据后,我通常会先跑 df.info()df.describe()。如果发现某列的数据类型不对(比如日期列显示为object),或者数值范围明显异常,我会先处理这些问题,再往下走。

查看列名和索引

# 查看列名
print(df.columns)

# 查看索引
print(df.index)

# 查看数据形状
print(df.shape)

shape 返回一个元组 (行数, 列数)。比如 (1000, 10) 表示1000行10列。

4.5 知识体系总览

为了让你更直观地理解这一章的内容,我画了一张图:

Pandas基础:数据创建与预览 Pandas核心 数据结构 Series DataFrame 数据读取 CSV读取 Excel读取 数据预览 head/tail info/describe 创建方式 从列表创建 从字典创建 从CSV读取 从Excel读取 常用操作 查看列名 查看形状 统计摘要 数据类型检查 缺失值

这张图把这一章的知识点串起来了。从数据结构(Series和DataFrame)出发,到数据读取(CSV和Excel),再到数据预览(head、info、describe等),最后是创建方式和常用操作。你想想看,是不是一目了然?

4.6 实战小贴士

最后,分享几个我在项目中积累的小经验:

  • 数据读取后先检查:用 df.info() 看看有没有缺失值,数据类型对不对。我遇到过日期列被读成字符串的情况,后面做时间序列分析时才发现,浪费了不少时间。
  • 列名规范化:CSV文件里的列名可能有空格、特殊字符。我习惯用 df.columns = df.columns.str.strip() 去掉空格,再用 df.rename() 改成统一的命名风格。
  • 大文件处理:如果CSV文件很大(比如几百万行),用 pd.read_csv('file.csv', chunksize=10000) 分块读取,避免内存溢出。
  • Excel多sheet:如果Excel文件有多个sheet,用 pd.read_excel('file.xlsx', sheet_name=None) 一次性读取所有sheet,返回一个字典。
核心要点: Series是一维数据,DataFrame是二维表格。数据读取用 read_csvread_excel。数据预览用 head()info()describe()。这些是Pandas最基础的操作,也是后续所有分析工作的起点。

好了,这一章的内容就到这里。记住,Pandas就像一把瑞士军刀,Series和DataFrame就是最常用的两个刀片。多用几次,自然就熟练了。

专注资料整理