2026年9月30日、Pythonのデータ分析ライブラリpandasの3.1.0の候補版、3.1.0rc0が公開されました。候補版は、正式版の前に最終確認をしてもらうための版です。
今回の変更で、学習者にいちばん関係が深いのがinplace=Trueの扱いです。入門記事や書籍でよく見かけるdf.reset_index(inplace=True)のような書き方の多くが、非推奨になります。
非推奨とは、今は動くけれど将来なくなる予定の機能のことです。今回は、候補版を実際に動かしながら、何が変わるのかを見ていきます。
まずは何が変わるのかを整理しよう¶
最初に、今回取り上げる変更を表にまとめます。内容は、pandasの公式リポジトリにあるWhat's new in 3.1.0という文書にもとづいています。
| 変更 | 中身 | 影響を受けやすい人 |
|---|---|---|
| inplaceの非推奨化 | 実際にはその場で書き換えていないメソッドのinplaceを非推奨に | 入門記事の書き方をそのまま使っている人 |
| DataFrame.select | 列を選んで、新しい列もその場で計算できる | 列の選択と追加をよく書く人 |
| filterの新しい使い方 | 条件で行を絞り込めるようになった | メソッドチェーンで書きたい人 |
| read_csvの高速化 | 大きなファイルを複数のCPUで並列に読む | 大きなCSVを扱う人 |
| 必要なバージョンの引き上げ | NumPy 2.0.2以上などが必要に | 古い環境を使っている人 |
PyPIの記録によると、3.1.0rc0が必要とするPythonは3.11以上です。正式版の公開日は、この文書の時点ではまだ決まっていません。
What's newによると、必須の依存ライブラリの最低バージョンも上がり、NumPyは2.0.2以上、python-dateutilは2.9.0以上が必要になりました。古い仮想環境をそのまま使い回している方は、pandasだけでなく周りのライブラリのバージョンも確かめるようにしましょう。
なお、普通にpip install pandasと打った場合は、候補版ではなく正式版の3.0系が入ります。候補版は、試したい人だけが明示的に選んで入れるものです。
pandasそのものがまだよくわからない方は、先にこちらを読んでおくと話がつながります。【関連記事】pandasとは?
inplace=Trueの多くが非推奨に¶
What's newによると、inplaceが非推奨になるのは、実際にはその場で書き換えていないメソッドです。対象として、次のメソッドが挙げられています。
| 種類 | メソッド |
|---|---|
| 行や列の削除 | drop、dropna、drop_duplicates |
| 名前の変更 | rename、rename_axis |
| インデックスの操作 | reset_index、set_index |
| 並べ替え | sort_values、sort_index |
| 式の評価 | eval、query |
どれも、データの前処理でよく使うものばかりですよね。入門書でinplace=Trueを覚えた方は、少なからず驚いたのではないでしょうか。
なぜ非推奨になったのか¶
What's newの説明によると、これらのメソッドのinplaceは、実質的には結果を元の変数に代入し直しているだけでした。データそのものを直接書き換えているわけではなかったのです。
さらに、pandas 3.0で導入されたCopy-on-Writeという仕組みにより、データのコピーを避けるためにinplaceを使う必要もなくなりました。こうした理由から、紛らわしいinplaceを整理することになったと説明されています。
書き換え方はとても簡単¶
直し方は、結果を変数に代入し直すだけです。What's newの例を、そのまま紹介します。
# これまでの書き方(非推奨)
df.reset_index(inplace=True)
# これからの書き方
df = df.reset_index()
What's newには、代入し直す書き方でも効率は落ちないと明記されています。もともと内部で同じことをしていたからです。
なお、fillnaやreplaceのように、実際に値をその場で書き換えられるメソッドは、inplaceが残ります。すべてのinplaceがなくなるわけではない点に注意してください。
実際に候補版で動かしてみた¶
では、3.1.0rc0を新しい仮想環境に入れて、新しい機能と非推奨の警告を試してみましょう。候補版は、pip install pandas==3.1.0rc0のようにバージョンを指定すると入れられます。
import warnings
import pandas as pd
warnings.simplefilter("always")
print(pd.__version__)
df = pd.DataFrame(
{"name": ["佐藤", "鈴木", "高橋"], "age": [61, 22, 35]}
)
# 新しいselect
print(df.select("name", age_months=pd.col("age") * 12))
# 条件で行を絞り込むfilter
print(df.filter(pd.col("age") > 30))
# inplace=True は非推奨に
df.reset_index(inplace=True)
手元のPython 3.11で実行した結果です。警告のメッセージは、読みやすいように短く省略しています。
3.1.0rc0
name age_months
0 佐藤 732
1 鈴木 264
2 高橋 420
name age
0 佐藤 61
2 高橋 35
Pandas4Warning: The inplace keyword in DataFrame.reset_index is deprecated and will be removed in a future version. See PDEP-8 for more details: ...
1つ目の表では、名前の列と、年齢を12倍して計算した新しい列が並んでいます。2つ目の表では、30歳より上の行だけが残りました。
最後の警告が、inplaceの非推奨を知らせるものです。警告の名前がPandas4Warningになっていることから、将来のpandas 4で取り除かれる予定だと読み取れます。
警告の意味と、警告をエラーにして洗い出す方法は、こちらで詳しく解説しています。【関連記事】Pythonのwarningsとは?
列を選ぶselectと、行を絞るfilter¶
先ほどのコードで使った2つの新しい機能を、もう少し詳しく見ておきましょう。どちらも、pd.col("列名")という書き方と組み合わせて使えます。
DataFrame.select¶
selectは、指定した列だけを持つ新しいDataFrameを返します。キーワード引数で名前を付ければ、計算した結果を新しい列として一緒に作れます。
What's newによると、assignと同じように、同じ呼び出しの中で先に作った列を、後の引数から参照することもできます。列の選択と追加を1回でまとめて書けるので、コードがすっきりします。
filterで条件を指定する¶
これまでのfilterは、列や行のラベルの名前で選ぶためのメソッドでした。3.1では、condという引数で、条件に合う行を絞り込めるようになりました。
What's newには、ラベルで選ぶitems、like、regexの使い方は、将来非推奨になる予定だとも書かれています。filterの役割が、少しずつ条件での絞り込みへ移っていくのかもしれません。
こうしたpd.col()を使った書き方は、Polarsの式の書き方にも似ています。先日のPolars 2.0のニュースとあわせて読むと、違いが見えてきます。【関連記事】Polars 2.0がリリース
read_csvが速くなった¶
もう1つの大きな変更が、CSVの読み込みの高速化です。What's newによると、標準のCエンジンでの読み込みが大きく速くなりました。
1つのスレッドでの読み込みでも、3.0と比べて一般に2〜3倍速いと説明されています。さらに、5MB以上の圧縮されていないローカルファイルは、複数のCPUコアで並列に読まれるようになりました。
並列で読むスレッドの数は、新しいmode.max_threadsという設定で変えられます。既定では使えるCPUの数で、上限は6です。
What's newには、並列でも結果は1つずつ読んだ場合と同じだと書かれています。すでに並列処理をしているアプリの中で使う場合は、1にして順番に読ませることもできます。
CSVの基本的な扱い方は、こちらで紹介しています。【関連記事】PythonでCSVを扱う方法
そのほかの気になる変更¶
What's newには、ほかにも知っておきたい変更がいくつか並んでいます。初心者にも関係しそうな2つを紹介します。
タイムゾーン付きの日時の.valuesが非推奨に¶
タイムゾーン付きの日時が入った列で.valuesを使うと、これまではタイムゾーンの情報が落ちたNumPyの配列が返っていました。3.1では、この動きが非推奨になり、Pandas4Warningが出ます。
What's newによると、pandas 4.0では、.valuesがタイムゾーンの情報を保ったまま返すように変わる予定です。今のうちに、.arrayや.to_numpy()を使い分ける書き方に慣れておくと安心です。
Timedelta.total_seconds()がナノ秒まで数えるように¶
時間の長さを表すTimedeltaのtotal_seconds()が、ナノ秒の部分も含めて計算するようになりました。What's newによると、これまでは1マイクロ秒より細かい部分が黙って切り捨てられていました。
実際に候補版でpd.Timedelta(nanoseconds=1500).total_seconds()を実行すると、1.5e-06と表示されました。1500ナノ秒は1.5マイクロ秒なので、細かい部分まで正しく数えられています。
今のうちにやっておきたいこと¶
最後に、正式版に備えてやっておきたいことを整理します。候補版を入れなくても、今の書き方を見直すことはできます。
| 順番 | やること |
|---|---|
| 1 | コードの中のinplace=Trueを探す |
| 2 | 対象のメソッドなら、df = df.xxx()の形に書き換える |
| 3 | NumPyが2.0.2以上かを確かめる |
| 4 | 余裕があれば、仮想環境で候補版を試す |
私は10年ほどエンジニアとして開発に関わってきましたが、inplace=Trueを付けたメソッドの戻り値をうっかり変数に入れて、中身がNoneになって困ったことがあります。inplaceを付けると戻り値がNoneになるので、代入する書き方に統一しておくほうが間違いが起きにくいと感じます。
実際に候補版でresult = df.sort_values("a", inplace=True)と書いてresultを表示すると、Noneと出ました。代入する書き方なら、こうした取り違えはそもそも起きません。
候補版を試すときは、普段の環境とは分けた仮想環境に入れるのが基本です。もし不具合を見つけたら、正式版の前に報告することで、pandasをよくする手助けにもなります。
まとめ¶
pandas 3.1.0の候補版rc0が、2026年9月30日に公開されました。inplace=Trueの多くが非推奨になり、selectやfilterの新しい使い方、read_csvの高速化が入っています。
なかでもinplaceの非推奨は、多くの学習者のコードに関わる変更です。正式版を待たずに、今日から代入し直す書き方に慣れておきましょう。
ここまでお読みいただきありがとうございました。