【2026 最新】Pandas 3.0来了:Copy-on-Write、PyArrow,以及你需要了解的内容
Source: Dev.to

介绍 & TL;DR
期待已久的 Pandas 3.0 已正式发布(2026 年初发布),为库带来了多年来最根本的变革。如果你在 Python 中处理数据,这次升级将显著影响代码的运行方式、性能,甚至会导致一些旧代码出现问题。
TL;DR:最大变化
- Copy‑on‑Write (CoW) 现已成为默认行为。 与恼人的
SettingWithCopyWarning说再见。 - PyArrow 字符串后端。 旧的用于字符串的
objectdtype 已被删除,取而代之的是超高速的 Apache Arrow 后端。 - 链式赋值错误。 通过链式索引修改 DataFrame(例如
df[df['A'] > 0]['B'] = 1)现在会抛出错误,而不是仅仅给出警告。
Source: …
1. 写时复制(Copy‑on‑Write)已成为标准
在历史上,Pandas 用户常常难以预测一次操作返回的是原始数据的 视图 还是 副本。这种不可预测性导致了臭名昭著的 SettingWithCopyWarning。
在 Pandas 3.0 中,写时复制(Copy‑on‑Write,CoW)默认开启且无法关闭。
这意味着什么?
任何由另一个 DataFrame 或 Series 派生的对象都将表现为完全独立的对象。不过,为了保持速度,实际的数据复制会被延迟(惰性求值),直到你显式修改其中一个对象时才进行。
import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3]})
subset = df[df["A"] > 1] # 这时还没有复制数据!
# 对 'subset' 的修改将在内部触发复制。
# 原始的 'df' 完全保持不变。
subset.iloc[0, 0] = 99
行话解释:写时复制(Copy‑on‑Write,CoW)
CoW 是一种内存管理技术。它不是在创建新变量时立即复制数据,而是让两个变量指向同一块内存。只有在其中一个变量被修改的那一刻,才会生成独立的副本。
破坏性变更:链式赋值
由于 CoW,链式赋值在形式上已被破坏。
- # Pandas 2.x(警告)或 Pandas 3.0(链式赋值错误)
- df[df['col1'] > 10]['col2'] = 100
+ # Pandas 3.0 正确写法
+ df.loc[df['col1'] > 10, 'col2'] = 100
始终使用 .loc 对子集进行赋值!
实战演练:观察惰性复制
你可以跟踪内存共享,直观看到 CoW 的工作方式:
import pandas as pd
import numpy as np
# 需要 pandas >= 3.0
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
# 切片会创建视图,完美演示 CoW
subset = df.iloc[1:3]
# 1. 此时两个 DataFrame 共享内存
print(np.shares_memory(df["B"].values, subset["B"].values)) # True
# 2. 修改子集会触发惰性复制
subset.iloc[0, 1] = 99
# 3. 现在它们完全独立
print(np.shares_memory(df["B"].values, subset["B"].values)) # False
2. PyArrow 字符串后端
如果你曾经处理过海量文本数据,你会知道 Pandas 过去将字符串存储为通用的 Python object 类型,这在速度和内存方面都效率低下。
在 3.0 版中,字符串现在被推断为专用的 str dtype,由 Apache Arrow 支持(前提是已安装 pyarrow)。
性能提升
切换到 PyArrow 后端可带来巨大的性能提升:
- 速度: 字符串操作(
.str.contains()、.str.lower())的运行速度提升 5–10 倍。 - 内存: 文本密集列的内存消耗降低最多 50 %。
import pandas as pd
# If pyarrow is installed, 'text' is now a PyArrow string array by default.
df = pd.DataFrame({"text": ["apple", "banana", "cherry"]})
print(df.dtypes)
# text string[pyarrow]
# dtype: object
这种列式 Arrow 格式还支持 零拷贝数据共享,可与 Polars、DuckDB 等现代工具无缝协作。
3. 其他值得注意的更改
- 微秒分辨率:
datetime数据的默认分辨率现在是微秒(而非纳秒),修复了超出 1678–2262 年范围的日期导致的越界错误。 - 已移除的弃用功能: 如
DataFrame.applymap()(请使用.map())、Series.ravel()和DataFrame.append()(请使用pd.concat())等函数已被永久移除。 - Python 3.11+ 要求: Pandas 3.0 至少需要 Python 3.11 和 NumPy 1.26.0。
结论
Pandas 3.0 是一次巨大的飞跃,成功解决了过去十年中最主要的两个痛点:字符串的内存低效以及不可预测的视图‑vs‑复制行为。
虽然迁移旧代码(尤其是去除链式赋值)可能需要一个周末的时间,但由此带来的性能和稳定性提升绝对值得投入。
在使用 Pandas 3.0 迁移时,您遇到过哪些具体的困难?欢迎在评论中告诉我们!