首页 / Pandas 入门教程 / Pandas 3.0 新特性速览

Pandas 入门教程

Pandas 3.0 新特性速览

本教程共 54 篇 · 第 4 篇 · 更新于 2026-08-11 · 约 7 分钟阅读

PandasPandas 入门教程Pandas 3.0Copy-on-WriteStringDtypePyArrow

本节目标:了解 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 不用记任何迁移。要升级老项目,记住两个检查点:

  1. 链式赋值 df["foo"][df["bar"] > 5] = 100 在 3.0 下不会生效,还会触发 ChainedAssignmentError,一律改写为 df.loc[df["bar"] > 5, "foo"] = 100
  2. 别依赖”改子集会改原表”的旧行为;需要真正独立的数据时,显式 .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 的缺失值显示为 ,和 pandas 自己的可空类型(第 07 章)体验类似,但底层存储更紧凑。

什么时候用?数据量大、列类型复杂时收益明显;小数据用默认后端就够,不用折腾。

读文件时想直接用 pyarrow 后端,给 read_csvdtype_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 的检查清单

给要升级老项目的同学列个清单,逐条核对:

  1. 全局搜索 df[“列”][条件] = 值 这类链式赋值,改成 df.loc[条件, “列”] = 值
  2. 全局搜索 dtype == "object" 的字符串判断,改成 dtype == "str"
  3. 跑一遍测试,重点看字符串列和原地修改相关逻辑

如果你的项目还在 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 章展开。