pandas 3.x系で何が変わったのか
2026年時点のpandasは、3.x系が主流となっています。
pandas 2.x系から3.x系への移行は、パフォーマンス改善や内部アーキテクチャの刷新が中心です。単なる機能追加だけでなく、以前のコードが警告やエラーになるケースもあるため、既存のコードベースを持つ方はアップデート前に変更点を確認しておくことをおすすめします。
pandasのインストール方法や基本的な使い方については、Pythonのpandasとは何か【インストールと基本的な使い方を解説】で解説しています。この記事ではそちらを前提として、3.x系の変更点に絞って解説します。
バージョンを確認する
まず、手元の環境でpandasのバージョンを確認します。
import pandas as pd
print(pd.__version__)
3.x.x
3.x系を使っているかどうかをここで確認してから、以降の内容を読み進めてください。
最新バージョンへのアップグレードはpipで行えます。
pip install --upgrade pandas
3.x系の主な変更点
Copy-on-Writeの本格導入(最重要)
pandas 3.x系で最も影響が大きい変更が、Copy-on-Write(CoW)の本格導入です。
pandas 2.x系ではオプションとして試験的に導入されていましたが、3.x系ではデフォルトで有効になっています。
Copy-on-Writeとは、DataFrameのスライスや操作をした際に、元のオブジェクトへの書き込みを防ぐ仕組みです。
Nullable型がデフォルトに近づいた
pandas 3.x系では、pd.NA を使うNullable型(Int64・Float64・StringDtypeなど)が以前より積極的に使われるようになっています。
これにより、欠損値の扱いが None や np.nan から pd.NA に統一されやすくなっています。
applymap()の削除
pandas 2.x系で非推奨になっていた DataFrame.applymap() が、3.x系では削除されています。代わりに DataFrame.map() を使います。
非推奨APIの削除
2.x系でDeprecationWarningが出ていたAPIの一部が正式に削除されています。主な削除・変更点は以下のとおりです。
DataFrame.swapaxes()の削除(DataFrame.transpose()を使用)DataFrame.applymap()の削除(DataFrame.map()を使用)read_csv()の一部引数の変更(squeezeパラメータの削除など)datetime関連のタイムゾーン挙動の変更
既存のコードでDeprecationWarningが出ていた場合は、3.x系への移行前に修正しておくことをおすすめします。
PyArrowバックエンドの強化
pandas 3.x系では内部処理の最適化が進んでいます。特に、Arrow(PyArrow)バックエンドのサポートが強化されており、大規模データの処理速度が改善されているケースがあります。
3.x系の書き方:よくある使い方
Copy-on-Writeへの対応
CoW導入前後で、スライスへの書き込み挙動が変わります。
2.x系までの挙動(問題になりやすかった例)
import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
subset = df[["A"]]
subset["A"] = 100 # 元のdfに影響するかどうかが曖昧だった
# 2.x系では SettingWithCopyWarning が出るケースがあった
# 挙動がコンテキストによって変わることがあった
3.x系の挙動
import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
subset = df[["A"]]
subset["A"] = 100 # 元のdfには影響しない(CoWにより明確化)
print(df)
A B
0 1 4
1 2 5
2 3 6
CoWの導入により、コピーかビューかの曖昧さが解消されました。元のDataFrameを変更したい場合は、直接代入する形に書き換えます。
# 元のdfを変えたい場合の書き方
df["A"] = 100
print(df)
A B
0 100 4
1 100 5
2 100 6
Nullable型の使い方
import pandas as pd
s = pd.array([1, 2, None], dtype="Int64")
print(s)
print(type(s[2]))
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64
<class 'pandas._libs.missing.NAType'>
np.nan を前提とした処理(例:np.nan との比較や float キャスト)がある場合は、動作が変わる可能性があります。欠損値のチェックには pd.isna() または pd.notna() を使うことで、型に依存しない確認ができます。
import pandas as pd
s = pd.Series([1, 2, None], dtype="Int64")
print(pd.isna(s))
0 False
1 False
2 True
dtype: bool
applymap()からmap()への書き換え
import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3]})
# 3.x系で推奨される書き方
result = df.map(lambda x: x * 2)
print(result)
A
0 2
1 4
2 6
map() と apply() の詳しい使い分けについては、pandas mapとapplyの違いと使い分けで解説しています。
groupby()でas_indexを明示する
groupby() の結果として返されるDataFrameのインデックス挙動は、バージョンによって変わるケースがあります。as_index を明示することで、バージョン間の差異を吸収しやすくなります。
import pandas as pd
df = pd.DataFrame({
"category": ["A", "A", "B", "B"],
"value": [10, 20, 30, 40]
})
# as_indexを明示することで挙動を安定させる
result = df.groupby("category", as_index=False)["value"].sum()
print(result)
category value
0 A 30
1 B 70
PyArrowバックエンドを使う
import pandas as pd
# ArrowDtypeを使ったDataFrame(PyArrowが必要)
df = pd.DataFrame({"A": [1, 2, 3]}, dtype="int64[pyarrow]")
print(df.dtypes)
A int64[pyarrow]
dtype: object
ArrowバックエンドはPyArrowのインストールが必要です。
pip install pyarrow
通常のpandas用途では必須ではありませんが、大規模データを扱う場合に検討できます。
よくある移行時のエラーと注意点
AttributeError: ‘DataFrame’ object has no attribute ‘applymap’
applymap() が削除されたことによるエラーです。
# エラーになるコード(3.x系)
# df.applymap(lambda x: x * 2)
# 修正後
df.map(lambda x: x * 2)
applymap() を使っている既存コードは map() に書き換えてください。
CoWによってDataFrameが変わらない
CoWの本格導入により、SettingWithCopyWarning 自体が出なくなった代わりに、スライスへの書き込みが静かに無視されるケースがあります。元のDataFrameが変わっていないと感じた場合は、CoWの影響を疑ってください。
明示的にコピーを取ってから変更するか、元のDataFrameに直接代入する形に書き換えます。
import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3]})
# 明示的にコピーして変更する
subset = df[df["A"] > 1].copy()
subset["A"] = 99
print(subset)
A
1 99
2 99
NaN関連の型エラー
Nullable型への移行により、float を前提とした np.nan の扱いが変わることがあります。型エラーが出た場合は、pd.isna() で欠損値を確認する方法に切り替えると型に依存しない処理になります。
2.x系から3.x系への移行手順
既存コードを移行する場合、以下の順で確認すると進めやすくなります。
ステップ1:DeprecationWarningを確認する
pandas 2.x系の最新バージョンで既存のコードを実行し、DeprecationWarningが出ている箇所を洗い出します。
python -W all your_script.py
ステップ2:CoWに対応した書き換えをする
スライス後に値を変更しているコードを確認し、意図に合わせて書き換えます。
ステップ3:削除されたAPIを置き換える
applymap() など削除されたAPIを、対応するメソッドに置き換えます。
ステップ4:テストを実行して挙動を確認する
単体テストや動作確認スクリプトを用いて、期待通りの結果が出るか確認します。
AI時代における補足
AIにpandasのコードを書かせる場面が増えていますが、生成されたコードがどのバージョンを前提にしているかは明示されないことが多いです。CoWの挙動変更や削除されたAPIなど、バージョン固有の差異を知っていると、AIの出力を読んだときに「このコードは古い書き方だ」と気づきやすくなります。
まとめ
pandas 3.x系の主な変更点をまとめます。
- Copy-on-Write(CoW)の本格導入:スライスへの書き込み挙動が明確化
- Nullable型の普及:
pd.NAを使う型が標準的になっている applymap()の削除:map()への移行が必要- 非推奨APIの削除:2.x系でWarningが出ていた箇所は修正が必要
- PyArrowバックエンドの強化:大規模データ処理の選択肢が広がった
移行時は、まず2.x系の最新バージョンでWarningを潰し、CoWへの対応を確認してから3.x系へアップグレードする流れが進めやすいです。
pandasの基本的な使い方から確認したい場合は、Pythonのpandasとは何か【インストールと基本的な使い方を解説】をあわせて参照してください。