1月22日、Pythonで広く使われているデータ解析ライブラリPandasのバージョン3.0がリリースされた。

この記事では、バージョン3.0.0で導入された新機能、仕様変更、およびパフォーマンスの向上について詳しく紹介する。
機能強化
デフォルトで専用の文字列データ型を導入
従来、Pandasは文字列の列をNumPyのobject型で表現していたが、これにはメモリ効率やパフォーマンスの面で課題があった。Pandas 3.0からは、専用の文字列データ型(str)がデフォルトで有効化される。PyArrowがインストールされている場合は内部的にサポートされ、未インストールの場合はobject型へフォールバックされる。
以前の動作:
>>> ser = pd.Series(["a", "b"])
0 a
1 b
dtype: object
新しい動作:
>>> ser = pd.Series(["a", "b"])
0 a
1 b
dtype: str
コピーオンライト(Copy-on-Write)による挙動の一貫性
「コピーオンライト」とは、データを参照しているだけの時は元のデータを共有し、「値を書き換える必要が出た時だけ」新しいメモリ領域にコピーを作成する仕組みだ。これにより、無駄なメモリ消費を抑えつつ、「いつの間にか元のデータが書き換わっていた」というバグを防ぐことができる。
pd.col() 構文の初期サポート
名前でDataFrameの列を参照し、式を構築するためのpd.col()が導入された。lambda関数を使用していた場所で、より簡潔に記述できるようになる。
In [1]: df = pd.DataFrame({'a': [1, 1, 2], 'b': [4, 5, 6]})
# 従来のlambdaを使用した方法
In [2]: df.assign(c = lambda df: df['a'] + df['b'])
# 新しいpd.colを使用した方法
In [3]: df.assign(c = pd.col('a') + pd.col('b'))
Arrow PyCapsule インターフェースのサポート
異なるDataFrameライブラリ間でゼロコピーに近いデータ移動を可能にするArrow PyCapsuleプロトコルをサポートした。DataFrame.from_arrow() および Series.from_arrow() メソッドが追加されている。
非推奨ポリシーの更新
PDEP-17に基づき、非推奨警告を3段階(DeprecationWarning → FutureWarning → 削除)で管理する新しいポリシーが適用された。
注目すべきバグ修正
observed=False を指定した際の groupby の動作が改善された。従来、複数のグループ化を行った場合に未観測のグループが NaN になる問題があったが、正しく処理されるよう修正されている。
In [4]: df = pd.DataFrame(
...: {
...: "key1": pd.Categorical(list("aabb"), categories=list("abc")),
...: "key2": [1, 1, 1, 2],
...: "values": [1, 2, 3, 4],
...: }
...: )
# 以前は複数のグループ化でNaNとなっていたが、現在は0(または適切な集計値)が返る
In [9]: gb[["values"]].apply(lambda x: x.sum())
Out[9]:
values
key1 key2
a 1 3
2 0
b 1 3
2 4
c 1 0
2 0
下位互換性のないAPIの変更
- 日時/時刻デルタ解像度の推論: 従来のナノ秒固定から、入力に基づいた適切な解像度(秒、ミリ秒、マイクロ秒など)を推論するようになった。
pd.offsets.Dayの挙動: 常に固定の24時間ではなく、カレンダー上の「1日」を表すようになり、夏時間(DST)の遷移を考慮するようになった。- Pythonバージョンの引き上げ: Python 3.11以降が必須となった。
- 依存関係の更新: NumPy 1.26.0以降、PyArrow 13.0.0以降などが推奨される。また、
pytzが必須ではなくなり、標準ライブラリのzoneinfoが優先されるようになった。
パフォーマンスの改善
Categorical.categoriesやDataFrame/Seriesのコンストラクタにおいて、可能な限りRangeIndexを返すように最適化された。- ハッシュジョイン(Hash-join)が使用可能な場合の
merge処理が高速化された。 - 文字列データ型に対するインデックス操作のパフォーマンスが向上した。
RangeIndexに対する多くの操作(__getitem__,append,argmin,value_countsなど)が高速化された。
詳細はPandas 3.0 releasedを参照していただきたい。