3. Pandas基础操作:Series与DataFrame创建、数据读取与预览

说实话,Pandas 是我在金融数据清洗中用得最多的工具,没有之一。你想想看,每天面对几百万条交易记录,没有 Pandas 简直寸步难行。这一节我们就把 Pandas 最核心的基础操作捋一遍,包括两种核心数据结构、数据读取,以及怎么快速预览数据。

3.1 Series 与 DataFrame:Pandas 的两大基石

Pandas 里就两种核心数据结构:SeriesDataFrame。Series 说白了就是一列数据,带个索引。DataFrame 是多列数据组成的表格,你可以把它想象成 Excel 里的一个工作表。

3.1.1 创建 Series

创建 Series 很简单,传一个列表或数组就行。我个人习惯用字典来创建,因为键会自动变成索引,非常直观。

import pandas as pd

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

# 从字典创建(推荐)
s2 = pd.Series({'平安银行': 12.5, '招商银行': 35.2, '兴业银行': 18.7})
print(s2)

我在项目中遇到过一个问题:用列表创建 Series 时,默认索引是 0,1,2... 但金融数据往往需要日期或股票代码作为索引。所以,我建议你创建时直接指定 index 参数。

# 指定索引
s3 = pd.Series([12.5, 35.2, 18.7], index=['平安银行', '招商银行', '兴业银行'])
print(s3)

3.1.2 创建 DataFrame

DataFrame 的创建方式就更多了。最常用的是从字典创建,每个键是一列,值是该列的数据。

# 从字典创建 DataFrame
data = {
    '股票代码': ['000001', '600036', '601166'],
    '股票名称': ['平安银行', '招商银行', '兴业银行'],
    '收盘价': [12.5, 35.2, 18.7],
    '成交量(万手)': [150.2, 89.5, 62.3]
}
df = pd.DataFrame(data)
print(df)

嗯,这里要注意:字典的键顺序在 Python 3.7+ 中会保留,但早期版本可能乱序。我建议用 columns 参数显式指定列顺序,这样更稳妥。

df = pd.DataFrame(data, columns=['股票代码', '股票名称', '收盘价', '成交量(万手)'])

3.2 数据读取:CSV、Excel 与数据库

金融数据最常见的来源就是 CSV 文件、Excel 表格和数据库。Pandas 对这三种来源都有很好的支持。

3.2.1 读取 CSV 文件

CSV 是金融数据最通用的格式。我用 read_csv() 读取过上千个 CSV 文件,这里有几个关键参数你必须知道。

# 基本读取
df = pd.read_csv('stock_data.csv')

# 常用参数
df = pd.read_csv(
    'stock_data.csv',
    encoding='utf-8',        # 编码,中文数据常用 utf-8 或 gbk
    sep=',',                 # 分隔符,默认逗号
    header=0,                # 表头在第0行
    index_col='日期',        # 将日期列设为索引
    parse_dates=['日期'],    # 自动解析日期
    dtype={'股票代码': str}  # 指定列类型,防止股票代码被当作数字
)

我曾经踩过一个坑:读取股票代码时,如果不指定 dtype=str,Pandas 会自动把 '000001' 变成 1。你想想看,这会导致数据匹配完全错乱。所以,股票代码、身份证号这类字段,一定要用 dtype 指定为字符串。

3.2.2 读取 Excel 文件

Excel 在金融行业也很常见,特别是从 Wind、Bloomberg 导出的数据。用 read_excel() 读取。

# 读取第一个工作表
df = pd.read_excel('financial_report.xlsx')

# 读取指定工作表
df = pd.read_excel('financial_report.xlsx', sheet_name='资产负债表')

# 读取多个工作表
dfs = pd.read_excel('financial_report.xlsx', sheet_name=['资产负债表', '利润表'])

# 跳过前3行,从第4行开始读
df = pd.read_excel('financial_report.xlsx', skiprows=3)

我个人习惯用 sheet_name=None 一次性读取所有工作表,返回一个字典,键是工作表名,值是 DataFrame。这样方便后续处理。

3.2.3 读取数据库

金融数据量一大,就得用数据库了。Pandas 通过 read_sql() 连接数据库,底层依赖 SQLAlchemy 或 sqlite3。

from sqlalchemy import create_engine

# 连接 MySQL 数据库
engine = create_engine('mysql+pymysql://用户名:密码@主机:端口/数据库名')

# 执行 SQL 查询
df = pd.read_sql('SELECT * FROM stock_daily WHERE trade_date >= "2024-01-01"', engine)

# 读取整张表
df = pd.read_sql_table('stock_daily', engine)

小技巧:读取大表时,可以用 chunksize 参数分批读取,避免内存爆炸。比如 pd.read_sql(sql, engine, chunksize=10000),返回一个迭代器,每次处理一万条。

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

数据读进来之后,第一件事就是看看它长什么样。Pandas 提供了几个非常方便的方法。

3.3.1 head() 与 tail():快速浏览

head() 看前几行,tail() 看后几行。默认显示 5 行,可以指定行数。

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

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

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

我每次拿到新数据,第一件事就是 df.head()df.tail()。为什么?因为头尾数据往往能暴露问题——比如尾部出现 NaN 值,说明数据可能没读全。

3.3.2 info():查看数据概览

info() 会告诉你 DataFrame 的完整信息:行数、列数、每列的非空值数量、数据类型、内存占用。这个函数我一天能用几十次。

df.info()

# 输出示例:
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 1000 entries, 0 to 999
# Data columns (total 5 columns):
#  #   Column      Non-Null Count  Dtype  
# ---  ------      --------------  -----  
#  0   股票代码      1000 non-null   object 
#  1   股票名称      1000 non-null   object 
#  2   收盘价        998 non-null    float64
#  3   成交量(万手)  995 non-null    float64
#  4   日期          1000 non-null   datetime64[ns]
# dtypes: datetime64[ns](1), float64(2), object(2)
# memory usage: 39.1+ KB

你看,info() 直接告诉我:收盘价有 2 个空值,成交量有 5 个空值。这就是数据清洗的起点。

3.3.3 describe():统计摘要

describe() 对数值列生成统计摘要,包括计数、均值、标准差、最小值、四分位数、最大值。金融数据分析中,这个函数能快速帮你发现异常值。

print(df.describe())

# 输出示例:
#              收盘价    成交量(万手)
# count   998.000000   995.000000
# mean     22.450000   120.300000
# std       8.120000    45.600000
# min       5.230000    12.100000
# 25%      15.670000    78.500000
# 50%      21.800000   115.200000
# 75%      28.900000   158.700000
# max      45.600000   320.400000

重点:如果 min 是负数,而你的数据是股价,那肯定有问题。如果 max 是均值的 10 倍以上,大概率有异常值。我曾在 describe() 中发现某只股票的成交量 max 是均值的 50 倍,后来查出来是数据录入时多了一个零。

3.4 知识体系结构图

下面这张图把 Pandas 基础操作的核心逻辑串起来了。你可以看到,数据从 CSV、Excel、数据库三种来源进入 Pandas,形成 Series 或 DataFrame,然后通过 head/info/describe 进行预览和诊断。

Pandas 基础操作知识体系 数据来源 CSV 文件 Excel 文件 数据库 核心数据结构 Series(一维) DataFrame(二维) 数据预览 head() tail() info() describe() 核心流程:读取数据 → 创建 Series/DataFrame → 预览诊断 为后续数据清洗与知识融合奠定基础

3.5 实战小贴士

最后分享几个我自己的习惯,希望能帮你少走弯路。

  • 读取数据后先看 shapedf.shape 返回 (行数, 列数),一眼就知道数据量级。如果行数比预期少很多,可能是读取时跳过了某些行。
  • 用 dtypes 检查列类型df.dtypes 比 info() 更简洁,适合快速确认每列的类型是否正确。
  • 空值检查别忽略df.isnull().sum() 能告诉你每列有多少空值。我每次清洗前必做这一步。
  • 索引要合理:金融数据最好用日期或股票代码做索引,这样后续切片、合并都方便。

我的一个习惯:每次读取完数据,我会写一个三行代码的检查流程:print(df.shape)print(df.head(2))print(df.isnull().sum())。这三行代码能解决 80% 的数据读取问题。

好了,Pandas 的基础操作就讲到这里。这些内容虽然基础,但却是金融数据清洗的根基。你想想看,如果连数据都读不对、看不全,后面的清洗和融合根本无从谈起。所以,多练练这些基础操作,形成肌肉记忆。

专注资料整理