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

发布: (2026年2月22日 GMT+8 09:04)
6 分钟阅读
原文: Dev.to

Source: Dev.to

Pandas 3.0 发布:写时复制、PyArrow 以及你需要了解的内容

介绍 & TL;DR

期待已久的 Pandas 3.0 已正式发布(2026 年初发布),为库带来了多年来最根本的变革。如果你在 Python 中处理数据,这次升级将显著影响代码的运行方式、性能,甚至会导致一些旧代码出现问题。

TL;DR:最大变化

  • Copy‑on‑Write (CoW) 现已成为默认行为。 与恼人的 SettingWithCopyWarning 说再见。
  • PyArrow 字符串后端。 旧的用于字符串的 object dtype 已被删除,取而代之的是超高速的 Apache Arrow 后端。
  • 链式赋值错误。 通过链式索引修改 DataFrame(例如 df[df['A'] > 0]['B'] = 1)现在会抛出错误,而不是仅仅给出警告。

Source:

1. 写时复制(Copy‑on‑Write)已成为标准

在历史上,Pandas 用户常常难以预测一次操作返回的是原始数据的 视图 还是 副本。这种不可预测性导致了臭名昭著的 SettingWithCopyWarning

在 Pandas 3.0 中,写时复制(Copy‑on‑Write,CoW)默认开启且无法关闭

这意味着什么?

任何由另一个 DataFrameSeries 派生的对象都将表现为完全独立的对象。不过,为了保持速度,实际的数据复制会被延迟(惰性求值),直到你显式修改其中一个对象时才进行。

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 迁移时,您遇到过哪些具体的困难?欢迎在评论中告诉我们!

0 浏览
Back to Blog

相关文章

阅读更多 »