一、全书概览

这本书是 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 循环,但速度更快、代码更短。"

重点讲了:

  • 列表推导式、字典推导式、集合推导式
  • 生成器表达式(省内存的利器)
  • enumeratezipmapfilter 等内置函数
  • 文件操作和异常处理

| 数据结构 | 特点 | 适用场景 | |----------|------|----------| | 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

对时间序列数据做分组聚合时,用 resamplegroupby 更好。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 范式

这是全书最重要的分析框架:

  1. Split:按某个条件把数据拆分成组(groupby
  2. Apply:对每组独立执行函数(agg/transform/apply
  3. 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 倍

五、金句摘录

  1. "pandas 最初是为处理金融时间序列而生的,但今天它已经是通用数据分析工具。"
  1. "在数据分析工作中,数据清洗和准备往往占用 80% 甚至更多的时间。"
  1. "向量化的 NumPy/Pandas 操作比 Python 循环快一到两个数量级,这不是优化建议,而是基本准则。"
  1. "好的数据可视化不是让图表更漂亮,而是让数据讲故事的能力更强。"
  1. "时间序列分析中,选择正确的时间频率(日/周/月/季/年)比选择什么模型更重要。"
  1. "分组聚合是数据分析的万能钥匙。如果你不知道怎么分析一组数据,先 groupby 看看。"

六、行动清单

🔥 每天(形成肌肉记忆)

  • [ ] 写 pandas 代码时,先检查 DataFrame 的 shapedtypesinfo()
  • [ ] 用 df.describe()df.value_counts() 做初步探索
  • [ ] 处理时间数据时,确认时区信息(tz_localizetz_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 太慢了,大文件怎么办?"

书里提了一些优化方向但没有展开。实际工作中的解决方案:① 用 dtypecategory 减少内存占用;② 用 chunksize 分块读取大 CSV;③ 用 Parquet/Feather 替代 CSV(读取速度提升 10-50 倍);④ 数据量真的太大就上 Dask 或 Polars。Polars 是近年崛起的新选择,API 和 pandas 类似但底层用 Rust 写的,性能在某些场景下比 pandas 快 5-10 倍。


笔记生成:2026-04-28 by 喵喵 🐈


相关笔记

同作者仅有此篇 同主题: