做数据分析的人几乎没有绕得开 pandas。无论你是在量化基金清洗行情数据,还是在互联网公司跑用户留存报表,DataFrame 都是这个领域事实上的通用货币。它不是最快的,但它是生态最全、文档最厚、Stack Overflow 答案最多的那一个。
pandas 是一个提供快速、灵活、富有表达力的数据结构的 Python 包,专注于处理带标签的关系型数据。本文第 1 节介绍项目概况与定位,第 2 节讲核心数据结构,第 3 节用真实代码演示日常操作,第 4 节讨论性能与进阶话题,第 5 节给出选型建议,最后总结。
1、项目概述
pandas 由 Wes McKinney 于 2008 年在量化对冲基金 AQR 内部启动,2010 年开源,如今是 NumFOCUS 赞助的项目,GitHub 上约 49.9k Star,采用 BSD 3-Clause 协议,商用无负担。官方文档在 pandas.pydata.org。
它的核心能力可以归纳为一张表:
| 能力 | 说明 |
|---|---|
| 数据结构 | Series 与 DataFrame |
| 分组运算 | split-apply-combine 式 groupby |
| 表关联 | merge、join,类 SQL 语义 |
| 重塑与索引 | 透视 pivot、分层 MultiIndex |
| 时间序列 | 重采样、时区、窗口函数 |
| I/O | CSV、Excel、SQL、HDF5 等 |
安装只需要一行命令,依赖仅有 NumPy、python-dateutil 和 tzdata(Windows 平台):
conda install -c conda-forge pandas
也可以用 pip install pandas。装的都是预编译二进制包;只有从源码构建才需要额外装 Cython。
2、核心数据结构
pandas 只有两种核心容器。
Series 是带标签的一维同类型数组,标签就是索引。两个索引不同的 Series 相加时,pandas 会自动按索引对齐,没对上的位置填 NaN——这是它和 NumPy 裸数组最本质的区别。
DataFrame 是带标签的二维表,每列是一个 Series,可以有不同的数据类型。行索引加列名构成完整的寻址系统,MultiIndex 分层索引还能自然表达面板数据。代价是同一个目标往往有多条路径(iloc、loc、query),建议尽早固定团队风格。
3、快速上手
日常数据分析的骨架是"读入、过滤、分组聚合、合并、导出"。下面是一段可以直接运行的完整流程:
import pandas as pd
orders = pd.read_csv("orders.csv", parse_dates=["created_at"])
recent = orders[
(orders["created_at"] >= "2026-01-01")
& (orders["amount"] > 0)
]
summary = (
recent.groupby("user_id")
.agg(total=("amount", "sum"),
cnt=("order_id", "count"))
.reset_index()
)
users = pd.read_csv("users.csv")
result = users.merge(summary, on="user_id", how="left")
result.to_csv("user_summary.csv", index=False)
这段代码里值得注意的是 agg 里的命名聚合:total=("amount", "sum") 直接指定输出列名,省去聚合后改列名的步骤。merge 的 how="left" 与 SQL 的 LEFT JOIN 语义一致:merge 对应 JOIN,groupby 对应 GROUP BY。
时间序列是 pandas 的传统强项:resample("1D") 做日重采样,rolling(window=7).mean() 算 7 日滚动均值,tz_convert 处理时区转换。
4、性能与进阶
pandas 慢的场景很集中:Python 循环逐行处理、循环里反复拼接、深拷贝。解法有三条。第一,向量化优先,能用整列运算完成的绝不写 for 加 df.loc[i, ...];必须逐行时用 itertuples(),它比 iterrows() 快数倍。第二,拼接用 pd.concat 一次完成,循环里反复 concat 是 O(n²) 的写法。第三,控制 dtype:读取时指定 dtype 和 usecols,把 ID 列转成 category,内存常能降一个量级。
对超出单机内存的数据,pandas 本身不是答案:I/O 层支持 Parquet 分区读写,配合 ArrowDtype 后端减少转换损耗,把大规模重活交给下游引擎。另一个实践建议是尽早开启 Copy-on-Write,它能消灭隐式拷贝的内存尖峰和链式赋值的幽灵 bug。
5、选型与注意事项
pandas 的短板在并行——它是单线程的,Rust 内核的新引擎在纯速度上已明显领先。但选型不是只看 benchmark:
- 团队技能栈以 pandas 为主时,迁移成本高于收益
- 生态工具默认输出
DataFrame - 数据量在 GB 级以下完全够用
- 超出内存的流式处理再考虑换引擎
版本升级要留意废弃项:例如旧式的 df.append 已在 2.0 中删除,长期维护的脚本建议在 CI 里加兼容性测试。另外注意空值语义:NaN、NaT、None 三者混合容易踩坑,判断空值统一用 isna()。
6、总结
pandas 定义了 Python 数据处理的接口范式,后来的每个竞品都提供了 pandas 兼容层。约 49.9k 的 Star 和 NumFOCUS 的背书,保证了它在未来几年仍是稳妥的默认选择。对于日常报表、探索性分析和中等规模数据的清洗,建议直接用 pandas,把功夫花在向量化与 dtype 管理上;对于超内存数据或多核密集的批处理,建议以 pandas 为前端描述逻辑、把执行交给更适合的引擎。


