SAIGの小橋昌明です。業務ではずっとPythonを書いています。
今回は Python連載 の6日目です。
Pythonを使ってデータ分析をする上で無くてはならないのがpandasです。リリースノートを見てみると、メジャーアップデートによる1.0.0 がリリースされたのが2020年の1月で、現時点での最新は1.3.3です。
ただ、1.0以降の機能で私自身が使ってるものは何だろうかと考えてみると、query
関数のエスケープシーケンスだけしか使っていない気がします。DataFrameから条件を指定してデータを抽出するquery関数は、列名に記号を含んでいたりすると上手く動かないことがありますが、v1.0以降はbacktick記号 (` ` )で囲むと動くようになりました。リリースノートはこちら。
しかし上記は新しい機能のごく一部にすぎません。せっかくバージョンアップされているのに、機能を使わないのはちょっともったいない……
今回、pandas 1.0以降の変更点を調べたので、2つ紹介します。
なお、1.0以降の最も大きい機能追加はpd.NAが導入されたことだと思います。が、これに関してはpandas 1.2.0+ での pd.NA の特徴という記事に非常に詳しく書かれているので、本記事では述べません。
重複したラベルを許容しないオプション指定(v1.2~)
※試験的な機能(Experimental Feature)
リリースノートはこちら、User Guide内の説明はこちらです。
このセクションのサンプルコードは全て、執筆時点の最新であるpandas 1.3.3を用いています。
pandasのindexやcolumnには重複したラベルを付けることができます。
pd.Series([1, 2], index=['a', 'a']) |
v1.2以降では、set_flags
関数を用いて、ラベル重複を許容しないようにできます。重複していた場合はDuplicateLabelError
というエラーが上がります。
pd.Series([1, 2], index=['a', 'a']).set_flags(allows_duplicate_labels=False) |
ラベルに重複があるかどうかを調べるだけならば、is_unique
関数を使えばよいです。こちらは1.0よりも前からある機能です。
pd.Series([1, 2], index=['a', 'a']).index.is_unique |
ラベルが重複していると処理時間が長くなってしまうので、concat
などでDataFrameを作った後はラベルを振り直した方が良いのでしょう。
さて、allows_duplicate_labels
の値は操作を通じて伝播(propagate)していきます。
ただ試験的な機能につき、伝播しない操作も多く存在するため注意しましょう、とドキュメントには書いてあります。
リリースノートにある例です。
a = ( |
# 重複ラベルが発生する操作 |
新しいSeriesを作るreindex
関数の返り値にも、allows_duplicate_labels=False
が伝播して設定されています。
では、試しにmerge
関数の例をやってみましょう。
df1 = pd.DataFrame({ |
df2 = pd.DataFrame({ |
col_Aを基準にmerge
すると、結果のDataFrameのindexは新たに0から振り直されるので、重複は発生しません。したがって、indexを基準にmerge
します。
df1.merge(df2, left_index=True, right_index=True) |
エラーが発生せずに、重複ラベルを含むDataFrameが作れてしまいました。allows_duplicate_labels
の値を確認します。
temp = df1.merge(df2, left_index=True, right_index=True) |
どうやら、merge
をするとallows_duplicate_labels
の値は伝播されないようです。まだ挙動には注意が必要そうですね。
存在しないラベルに対する.locの挙動(v1.0~、v1.1~)
df1 = pd.DataFrame({ |
ここで、.loc
関数で複数の行を指定し、その中に存在しない行名が入っている場合の挙動を示します。
まずはpandas 1.0.0より前の挙動から。
# pandas 0.25.3 |
将来的にはエラーになるよという旨のFutureWarning
が出ます。また、存在しないindexの分はNaN
が要素に入ります。
# pandas 0.25.3 |
列を指定するときにうっかり列名を間違えたりすると、全要素がNaN
の列が新たに作られたDataFrameが返ってきます。
実際のデータ分析ではDataFrameを表示しないでしょうから、分析を進めるとしばらく後で思わぬエラーに遭遇して戸惑うかもしれません。
この挙動は1.0以降で変更されました。
# pandas 1.0.0 |
1.0以降では存在しない行名が含まれている場合、KeyError
が上がります。
リリースノートはこちらです。
(「列名を間違えた場合」の例でも全く同じエラーになるので、こちらは割愛します)
# pandas 1.3.3 = 最新版 |
さらに1.1以降では、エラーメッセージが分かりやすくなりました。どのラベルが存在しないかを表示してくれます1。
リリースノートはこちらです。
まとめ
1.0.0 メジャーアップデート後のpandasの、新しい機能や変更点を紹介しました。Experimental Featureもあり、使う際には注意も必要ですが、必要に応じて活用していけると良いですね。
- 1.調べていたら1.2.3と最新1.3.3との間でKeyErrorのメッセージが少し違っていることにも気づいたのですが、あまりにもマニアックなので脚注に書くだけに留めておきます。いつ変更されたんだろう? ↩