Pandas 3.0 新特性速览
本教程共 54 篇 · 第 4 篇 · 更新于 2026-08-11 · 约 7 分钟阅读
本节目标:了解 pandas 3.0 的四个大变化:Copy-on-Write 默认开启、新字符串类型、PyArrow 后端和性能提升,升级不踩坑。
版本背景
pandas 3.0.5 于 2026-07-22 发布。3.0 是继 2.0 之后又一次大版本更新,核心变化有两个:Copy-on-Write(写时复制)成为默认且唯一的模式,字符串有了专属的新数据类型。另外 PyArrow 后端和性能优化也是重头戏。
这次升级不是突然来的:2.1 到 2.3 陆续把 CoW 优化落地,2.3 还提供了新字符串类型的体验开关,3.0 一次性转正。老用户其实已经被提前剧透过了。
对新手来说,直接学 3.0 反而省事:没有旧习惯要改,照着新写法走就行。这一章先把变化讲清楚,后面各章节涉及的地方还会再提醒。
Copy-on-Write 默认开启
老版本里有个坑:从 DataFrame 取出的子集和原表共享数据,改子集可能连带改到原表,行为很难预测。3.0 起 Copy-on-Write(写时复制,CoW)成为默认且唯一的模式,把这个坑彻底填了:任何派生对象在修改前先复制,原表纹丝不动。
对新手来说,直接学 3.0 不用记任何迁移。要升级老项目,记住两个检查点:
- 链式赋值
df["foo"][df["bar"] > 5] = 100在 3.0 下不会生效,还会触发ChainedAssignmentError,一律改写为df.loc[df["bar"] > 5, "foo"] = 100 - 别依赖”改子集会改原表”的旧行为;需要真正独立的数据时,显式
.copy()
CoW 的完整机制在第 09 章展开。
新字符串类型 StringDtype
过去几十年,字符串一直存放在 NumPy 的 object 类型里。object 什么都能装,导致两个问题:性能差、语义模糊(看到 object 不知道是字符串还是别的)。
其实 pandas 从 1.0 起就提供了可选的 string 类型,只是没转正。3.0 把它设为默认:字符串默认推断为新的 StringDtype,显示为 str。
import pandas as pd
s = pd.Series(["a", "b", None])
print(s.dtype) # str
几个关键行为:
- 缺失值统一用 NaN 表示
- 只能存字符串,往里塞数字直接报 TypeError
- 底层优先用 PyArrow 存储(装了 pyarrow 时),速度更快
- astype(“str”) 不再把缺失值变成字符串 “nan”
- 判断字符串列从
s.dtype == "object"改成s.dtype == "str"
字符串方法照常工作,比如 s.str.upper() 转大写,写法没变,只是底层换了:
import pandas as pd
s = pd.Series(["a", "b", None], dtype="str")
print(s.str.upper()) # A / B / NaN
想写兼容 2.x 和 3.x 的代码,用 is_string_dtype 判断:
import pandas as pd
s = pd.Series(["a", "b"])
print(pd.api.types.is_string_dtype(s.dtype)) # True,新旧版本都成立
在 pandas 2.3 里可以提前体验这个特性:
import pandas as pd
pd.options.future.infer_string = True
对新手意味着什么
直接学 3.0 的同学省心:本教程的写法就是新写法,不用记迁移。参考老教程时留个心眼,遇到链式赋值、dtype 判断这类写法,按本章的规则改过来。
升级老项目的同学,在 2.2 里可以开警告模式,把所有会受 CoW 影响的代码提前暴露出来:
import pandas as pd
pd.options.mode.copy_on_write = "warn"
警告会比较多,重点处理链式赋值相关的即可。
PyArrow 后端
PyArrow 是 Apache Arrow 的 Python 实现,pandas 可以用它当数据后端。先装 pyarrow:
pip install pyarrow
import pandas as pd
# 用 pyarrow 后端创建带缺失值的整数列
s = pd.Series([1, 2, None], dtype="int64[pyarrow]")
print(s) # 缺失值显示 <NA>
优势:
- 数据类型比 NumPy 更丰富,所有类型都支持缺失值
- 读 CSV 等文件时指定 engine=“pyarrow” 或 dtype_backend=“pyarrow” 可加速
- 字符串、聚合、算术等操作有 Arrow 原生计算加速
- 与 polars、cuDF 等 Arrow 生态库互操作顺畅
PyArrow 的缺失值显示为
什么时候用?数据量大、列类型复杂时收益明显;小数据用默认后端就够,不用折腾。
读文件时想直接用 pyarrow 后端,给 read_csv 传 dtype_backend 参数即可:
import pandas as pd
# 读 CSV 并直接得到 pyarrow 后端的数据
# df = pd.read_csv("data.csv", dtype_backend="pyarrow")
性能提升
3.0 的性能提升主要来自三处:
- CoW 延迟复制:不再到处立即复制数据
- 字符串走 PyArrow 存储和计算
- 官方推荐安装 pandas[performance](numexpr、bottleneck、numba)
pip install "pandas[performance]"
什么时候值得关心性能?数据量到几十万行以上,或者某个操作在循环里反复执行时。日常小数据不用纠结,先把逻辑写对,性能优化是后置项(第 53 章专题)。
升级到 3.0 的检查清单
给要升级老项目的同学列个清单,逐条核对:
- 全局搜索 df[“列”][条件] = 值 这类链式赋值,改成 df.loc[条件, “列”] = 值
- 全局搜索
dtype == "object"的字符串判断,改成dtype == "str" - 跑一遍测试,重点看字符串列和原地修改相关逻辑
如果你的项目还在 2.x,也可以提前适应:2.1 起用 pd.options.future.infer_string 体验新字符串类型,2.2 起用 CoW 警告模式排查受影响的代码。
StringDtype 的取舍
3.0 里默认字符串就是 str,绝大多数场景直接用。什么情况还要手动指定 object?一是确实要往文本列里塞非字符串对象,二是兼容老代码的临时方案。其余情况 str 更省心:语义清楚、性能更好、缺失值行为统一。
官方有专门的迁移指南(Migration guide for the new string data type),升级前值得通读。本章只讲最影响日常使用的部分,CoW 的完整机制在第 09 章展开。