一、全书概览
这本书是 Wes McKinney——pandas 库的创造者——写的第二版,基于 Python 3.6 和 pandas 0.23.0。全书围绕"用 Python 做数据分析"这一件事,把 NumPy、pandas、matplotlib、scikit-learn 串成一条线。
第一版出版于 2012 年,那时 pandas 还没今天这么普及。第二版大幅更新了 API(很多第一版的用法在第二版已经废弃),加入了更多关于时间序列、分组聚合、数据清洗的实际案例。整本书不是教科书式的理论堆砌,而是"手把手教你干活"的实战手册。
核心路线: Python 基础 → NumPy 数组计算 → pandas 数据结构 → 数据清洗与准备 → 数据聚合与分组 → 时间序列分析 → 数据可视化 → 实战案例(美国选举数据、美联储经济数据等)。
全书约 400 页,代码量极大,几乎每一页都有可运行的示例。这不是一本"读完就放回书架"的书,更像是放在工位上随时翻的工具书。
适合谁读: 有一定 Python 基础,想系统学数据分析的人。纯新手建议先补 Python 基础再看。
不适合谁: 想学机器学习理论的(这本书不讲算法原理,只讲数据处理),想做深度学习的(那是另一条线)。
二、逐章要点
第1章:准备工作
环境搭建,IPython 和 Jupyter Notebook 的使用。Wes 用了整整一章讲开发环境,这在技术书里不常见,但对新手非常实用。
"IPython 之所以能成为标准工具,核心在于 Tab 补全、
?内省和%magic命令。"
| 工具 | 用途 | 备注 |
|------|------|------|
| IPython | 交互式计算 | Tab 补全是效率倍增器 |
| Jupyter Notebook | 文档化分析 | 支持 Markdown + 代码混排 |
| conda | 环境管理 | 比 pip 更适合数据科学栈 |
| %timeit | 性能计时 | 微基准测试必备 |
- [x] 理解 IPython 的
?和??内省机制 - [x] 掌握 Jupyter Notebook 的基本操作
- [ ] 自定义 IPython 启动脚本(
.ipython_profile.py) - [ ] 配置 conda 虚拟环境隔离不同项目依赖
这章最被低估的内容是魔法命令(magic commands)。%time、%timeit、%run、%load 这些东西在日常工作中每天都要用,但很多人只知道 %matplotlib inline。
第2章:Python 语言基础(IPython 入门)
快速过一遍 Python 数据结构和函数式编程工具。如果你已经写过半年 Python,这章可以跳着看。
"Python 的列表推导式
[expr for val in collection if condition]等价于 for 循环,但速度更快、代码更短。"
重点讲了:
- 列表推导式、字典推导式、集合推导式
- 生成器表达式(省内存的利器)
enumerate、zip、map、filter等内置函数- 文件操作和异常处理
| 数据结构 | 特点 | 适用场景 | |----------|------|----------| | list | 有序可变 | 通用序列 | | tuple | 有序不可变 | 固定数据、字典键 | | dict | 键值对 | 查找表、配置 | | set | 无序唯一 | 去重、集合运算 | | 生成器 | 惰性求值 | 大数据流处理 |
- [x] 熟练使用列表推导式替代 for 循环
- [x] 理解生成器与列表的内存差异
- [ ] 掌握 itertools 模块的高级用法
- [ ] 用生成器处理 GB 级文件流
第3章:NumPy 基础
NumPy 是整本书的地基。没有 NumPy,就没有 pandas。这章从 ndarray 开始,讲索引、切片、向量化运算、广播机制。
"NumPy 的核心优势:C 语言级别的循环速度 + Python 级别的表达力。一个 100 万元素的数组求和,NumPy 比 Python 原生 list 快 100 倍以上。"
ndarray 是全书最重要的数据结构之一。它和 Python list 的区别不是"语法糖",而是根本性的架构差异:ndarray 在内存中是连续存储的同类型数据块,CPU 缓存命中率高,可以批量执行 SIMD 指令。
| 操作 | NumPy 写法 | 纯 Python 写法 | 速度差 |
|------|-----------|----------------|--------|
| 元素平方 | arr ** 2 | [x**2 for x in lst] | ~100x |
| 条件筛选 | arr[arr > 0] | [x for x in lst if x > 0] | ~50x |
| 矩阵乘法 | arr1 @ arr2 | 嵌套循环 | ~1000x |
| 布尔运算 | arr > 0 | [x > 0 for x in lst] | ~100x |
广播机制(broadcasting)是 NumPy 的杀手锏。它让不同形状的数组可以直接运算,不用手动 expand_dims。理解广播规则后,你会发现很多"需要写循环"的操作其实一行代码搞定。
- [x] 理解 ndarray 的内存模型和连续性
- [x] 掌握花式索引(fancy indexing)和布尔索引
- [x] 理解广播机制的形状匹配规则
- [ ] 用 np.einsum 处理复杂张量运算
- [ ] 理解 C order vs Fortran order 的性能影响
第4章:pandas 基础
这是全书的核心章节。Series 和 DataFrame 两个数据结构,加上索引机制,构成了 pandas 的骨架。
"DataFrame 就是一个带标签的二维数组,列可以是不同类型。它是 pandas 的灵魂,几乎所有操作都围绕它展开。"
Series:一维带标签数组,可以理解为"有索引的 NumPy 数组 + 字典的混合体"。 DataFrame:二维表格,每列是 Series,共享同一个 Index。
索引(Index)是 pandas 的核心设计。它不是简单的行号,而是一个不可变的标签数组。理解索引是理解 pandas 一切操作的前提:loc(标签索引)、iloc(位置索引)、布尔索引、花式索引,四种方式各有用途。
| 索引方式 | 语法 | 用途 |
|----------|------|------|
| loc | df.loc[row_label, col_label] | 按标签取值 |
| iloc | df.iloc[row_pos, col_pos] | 按位置取值 |
| 布尔索引 | df[df['age'] > 18] | 条件筛选 |
| reindex | df.reindex(new_index) | 对齐/重排索引 |
- [x] 区分 loc 和 iloc 的使用场景
- [x] 掌握 DataFrame 的基本 CRUD 操作
- [x] 理解层级索引(MultiIndex)的基本用法
- [ ] 熟练使用层次化索引处理面板数据
- [ ] 掌握索引的不可变性和性能优化
第5章:pandas 入门进阶(数据清洗与准备)
实际工作中 80% 的时间在清洗数据,这章讲的就是那 80%。缺失值处理、数据变换、字符串操作、合并连接。
"数据清洗不是脏活,是数据分析师的核心能力。你的模型再好,喂进去垃圾数据,出来的还是垃圾。"
缺失值处理是重点:dropna(删除)、fillna(填充)、isna(检测)。填充策略不只是填 0 或均值,还有前向填充 ffill、后向填充 bfill、插值法 interpolate。
数据变换包括:离散化 pd.cut/pd.qcut、排序 sort_values/sort_index、排名 rank、移位 shift。
合并操作有三个层级:
| 操作 | 函数 | 类比 SQL |
|------|------|----------|
| 纵向堆叠 | pd.concat | UNION ALL |
| 横向连接 | pd.merge | JOIN |
| 组合列 | df.combine_first | COALESCE |
字符串处理用 .str 访问器,正则表达式、大小写转换、切片、提取全部支持。这比 Python 原生字符串操作方便太多。
- [x] 熟练处理缺失值(检测、删除、填充)
- [x] 掌握 merge/join 的各种连接方式
- [x] 用 str 访问器做批量字符串处理
- [ ] 掌握 apply/map/transform 的性能差异和适用场景
- [ ] 用 pipe 构建可复用的数据清洗流水线
第6章:数据聚合与分组运算
groupby 是 pandas 最强大的功能之一,也是这本书最有含金量的章节。分组 → 应用 → 组合,这个三步模式贯穿整个数据分析流程。
"groupby 的'分裂-应用-组合'(split-apply-combine)范式,是 Hadley Wickham 在 2005 年提出的,后来被几乎所有数据分析工具采用。"
分组聚合:df.groupby('key').agg({'col1': 'mean', 'col2': ['sum', 'count']})
分组变换:df.groupby('key').transform(lambda x: x - x.mean()),保持原始 DataFrame 形状。
分组过滤:df.groupby('key').filter(lambda x: x['value'].mean() > 100)
| apply/transform/agg 区别 | 输入 | 输出形状 | 典型用途 | |--------------------------|------|----------|----------| | agg | 列/整个组 | 每组一行 | 汇总统计 | | transform | 列 | 与原始相同 | 标准化、填充 | | apply | 整个组 | 任意 | 复杂自定义逻辑 |
交叉表(crosstab)和透视表(pivot_table)是多维分析的标准工具。Excel 用户转到 pandas 后,这两个函数能直接替代 Excel 的数据透视表功能。
- [x] 理解 split-apply-combine 范式
- [x] 掌握 agg/transform/apply 三兄弟的区别
- [x] 用 pivot_table 做多维分析
- [ ] 用 groupby 处理时间序列重采样
- [ ] 用 pipe 链式组合多步分组操作
第7章:时间序列
Wes McKinney 在 AQR Capital Management 做过量化分析师,时间序列是他最擅长的领域之一。这章讲得比大多数专门讲时间序列的书还实用。
"pandas 最初就是为了处理金融时间序列而创建的。时间序列支持是 pandas 的基因,不是后来加的功能。"
核心概念:Timestamp、DatetimeIndex、Period、Timedelta。
| 时间类型 | 说明 | 示例 |
|----------|------|------|
| Timestamp | 单个时间点 | pd.Timestamp('2024-01-01') |
| DatetimeIndex | 时间点序列 | pd.date_range('2024', periods=365) |
| Period | 时间段 | pd.Period('2024-01', freq='M') |
| Timedelta | 时间差 | pd.Timedelta(days=7) |
重采样(resample) 是时间序列分析的核心操作:从日数据聚合到月数据(降采样)、从月数据拆分到日数据(升采样)。配合 ohlc(开高低收)函数,可以直接生成金融 K 线数据。
时区处理:tz_localize(本地化)和 tz_convert(转换)是处理跨国数据的必备技能。pandas 用 pytz 库支持全球 600+ 个时区。
移动窗口统计(rolling window)也是重点:df.rolling(window=7).mean() 计算 7 日移动平均线,df.ewm(span=12).mean() 计算指数加权移动平均。
- [x] 理解 pandas 时间序列的四种核心类型
- [x] 掌握 resample 做时间频率转换
- [x] 处理时区转换问题
- [ ] 用 rolling/expanding 做滑动窗口分析
- [ ] 理解 Period 和 PeriodIndex 的高级用法
第8章:数据可视化与实战
用 matplotlib 和 seaborn 画图,以及几个完整的数据分析案例。这章更像是一个"把前面学的全串起来"的综合练习。
"一图胜千言。但前提是,你得知道该画什么图、怎么画才不会误导读者。"
matplotlib 是 Python 可视化的"底层引擎",语法偏底层但灵活性最高。seaborn 基于 matplotlib,提供了更高级的统计图表接口。
| 图表类型 | 函数 | 适用场景 |
|----------|------|----------|
| 折线图 | plt.plot | 时间序列趋势 |
| 柱状图 | plt.bar | 分类比较 |
| 直方图 | plt.hist | 分布分析 |
| 散点图 | plt.scatter | 相关性分析 |
| 箱线图 | sns.boxplot | 异常值检测 |
| 热力图 | sns.heatmap | 相关性矩阵 |
实战案例包括:美国 1880-2010 年婴儿名字趋势分析、美国农业部食品数据库分析、2012 年联邦选举委员会数据等。这些案例的数据全部公开可下载,适合照着代码复现。
- [x] 掌握 matplotlib 的基本绑图流程
- [x] 用 pandas 内置的
.plot()快速可视化 - [x] 完成书中的婴儿名字分析案例
- [ ] 用 seaborn 做高级统计图表
- [ ] 建立自己的可视化代码模板库
三、关键概念速查
1. ndarray 的轴(axis)
NumPy 中 axis=0 是行方向(垂直),axis=1 是列方向(水平)。sum(axis=0) 是按列求和,sum(axis=1) 是按行求和。这个概念贯穿 NumPy 和 pandas 的所有聚合操作,搞反了结果就全错。
2. pandas 索引对齐(alignment)
pandas 在运算时会自动对齐索引。两个 Series 相加,只有共同索引的值会相加,其他为 NaN。这个设计减少了大量手动 merge 操作,但也是初学者最容易踩坑的地方。
3. 视图与副本(view vs copy)
df.iloc[0, 0] = 100 修改的是原数据(视图),df[df['a'] > 0]['a'] = 1 修改的是副本(SettingWithCopyWarning 警告)。理解这个区别能避免大量隐蔽 bug。
4. 分组聚合三件套
agg 返回每组一个值(聚合),transform 返回与原始同形状的结果(变换),apply 可以返回任意形状(灵活但慢)。三者选型原则:能用 agg 就不用 apply。
5. 重采样 vs groupby
对时间序列数据做分组聚合时,用 resample 比 groupby 更好。resample 专门处理时间索引,支持降采样(日→月)和升采样(月→日),还能处理时区转换。
6. Categorical 类型
对于重复值多的字符串列(如性别、国家、类别),转成 category 类型可以节省 5-10 倍内存,提升 groupby 性能。一个 1 亿行 100 万唯一值的字符串列,转成 category 后内存从 800MB 降到约 100MB。
四、核心框架/模型
数据分析工作流(Wes 模型)
获取数据 → 清洗/整理 → 探索/分析 → 建模/可视化 → 报告/交付
↓ ↓ ↓ ↓
pd.read_* fillna/ describe/ plt.plot/
dropna/ groupby/ seaborn
merge/ value_counts
str处理
这个流程不是线性的,而是迭代的。你会在"探索"阶段发现数据问题,回到"清洗"阶段修复;在"建模"阶段发现特征不够,回到"分析"阶段挖掘新特征。
Split-Apply-Combine 范式
这是全书最重要的分析框架:
- Split:按某个条件把数据拆分成组(
groupby) - Apply:对每组独立执行函数(
agg/transform/apply) - Combine:把结果合并成新数据结构
几乎所有数据分析问题都可以用这个范式拆解。Excel 的数据透视表、SQL 的 GROUP BY、R 的 dplyr,本质上都是这个思路。
性能优化决策树
数据太大?
├── 能装进内存吗?
│ ├── 能 → 用 pandas(注意 category、dtype 优化)
│ └── 不能 → 用 Dask 或分块读取(chunksize)
├── 循环太慢?
│ ├── 能用向量化吗? → 用 NumPy/pandas 内置函数
│ ├── 必须用循环? → 用 Cython 或 numba 加速
│ └── I/O 瓶颈? → 用 HDF5/Parquet 替代 CSV
└── groupby 太慢?
└── 检查 key 的类型,category 类型可以加速 3-5 倍
五、金句摘录
- "pandas 最初是为处理金融时间序列而生的,但今天它已经是通用数据分析工具。"
- "在数据分析工作中,数据清洗和准备往往占用 80% 甚至更多的时间。"
- "向量化的 NumPy/Pandas 操作比 Python 循环快一到两个数量级,这不是优化建议,而是基本准则。"
- "好的数据可视化不是让图表更漂亮,而是让数据讲故事的能力更强。"
- "时间序列分析中,选择正确的时间频率(日/周/月/季/年)比选择什么模型更重要。"
- "分组聚合是数据分析的万能钥匙。如果你不知道怎么分析一组数据,先 groupby 看看。"
六、行动清单
🔥 每天(形成肌肉记忆)
- [ ] 写 pandas 代码时,先检查 DataFrame 的
shape、dtypes、info() - [ ] 用
df.describe()和df.value_counts()做初步探索 - [ ] 处理时间数据时,确认时区信息(
tz_localize或tz_convert)
📋 每周(刻意练习)
- [ ] 用 Jupyter Notebook 完成一个完整的数据分析小项目(从获取到可视化)
- [ ] 复习一种 groupby 操作(agg/transform/apply 轮换)
- [ ] 翻阅 pandas 官方文档的 "User Guide",学习一个没用过的函数
🎯 每月(体系提升)
- [ ] 用真实数据集做一次端到端分析(推荐 Kaggle 数据集或政府公开数据)
- [ ] 整理自己的 pandas 代码片段库(常用清洗、聚合、可视化模板)
- [ ] 关注 pandas release notes,了解新版本变化(pandas 2.x 有大量性能改进)
- [ ] 读一篇数据分析领域的优秀博文或论文,学习新的分析方法
七、一句话总结
pandas 之父手把手教你用 Python 干数据分析师的活——从数组计算到时间序列,从脏数据清洗到分组聚合,这本书是通往数据科学实战最短的那条路。
八、读者热议
1. "第2版和第1版差别大吗?值不值得重新买?"
差别不小。pandas 从 0.x 升级到 0.23,很多 API 改了甚至删了。第一版里大量 .ix 索引在第二版已经被废弃(推荐用 .loc/.iloc),Categorical 类型是新增内容,时间序列处理也有大幅改动。如果你还在用第一版的代码风格,建议直接换第二版。
2. "这书学完之后看什么?"
三条路线:想做机器学习 → 《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》;想深入 pandas → 官方文档的 "Advanced" 部分 + 《Python Data Science Handbook》;想走量化金融 → 《Advances in Financial Machine Learning》(Marcos Lopez de Prado)。这本书的定位是"数据处理的基石",不是终点。
3. "pandas 太慢了,大文件怎么办?"
书里提了一些优化方向但没有展开。实际工作中的解决方案:① 用 dtype 和 category 减少内存占用;② 用 chunksize 分块读取大 CSV;③ 用 Parquet/Feather 替代 CSV(读取速度提升 10-50 倍);④ 数据量真的太大就上 Dask 或 Polars。Polars 是近年崛起的新选择,API 和 pandas 类似但底层用 Rust 写的,性能在某些场景下比 pandas 快 5-10 倍。
笔记生成:2026-04-28 by 喵喵 🐈
相关笔记
同作者仅有此篇 同主题: