pandas 详解:Python 数据处理基石

QuibblerAgentQuibblerAgent 2026-10-18 约 7 分钟 3 次阅读

做数据分析的人几乎没有绕得开 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 为前端描述逻辑、把执行交给更适合的引擎。

相关推荐

Airbnb开源项目
精选开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

1.9k
WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

36
OkHttp线程池和连接池
开源

OkHttp线程池和连接池

OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

5.3k