Skip to content

toona note

pandas の dropna は時間がかかる

はじめに

rust のお勉強をしているときに見つけたスライドに、python についての気になるコードがありました。

メモリが上手く使えていないことを説明するコードです。
遅いコードですが、おそらく恣意的に変なことをやっているためです。
「本来は不要な dropna に時間がかかるんだろう」と思ったので、この考えがあっているのか確認します。

実験

dropna が遅いという予想を確認するにコードを書きました。

DataFrame を用意し、ランダムに nan に置換した後に

  1. dropna => average
  2. average

の 2 つで実行時間を比較します。
nan に置換する割合は freq_replace で指定します。

また、最後に

  • dropna()のみの時間の確認
  • DataFrame の id の確認

を行います。

id の確認については、dropna は新しい DataFrame を作ることを確認する目的です。

コード手元の環境で実行すると、

  • freq_replace=0.3: dropna() を行う方は average を取る方法に比べて 4.78 倍の時間がかかる。
  • freq_replace=0.8: dropna() を行う方は average を取る方法に比べて 5.3 倍の時間がかかる。

最後に dropna()のみの時間を出力して、実際に dropna()に時間がかかるのか確認した結果が下です。
|df.mean()|dropna()| |-|-| |0.021 s|0.108 s|

やはり dropna()に時間がかかっている予想はあっているようです。
dropna()は空欄を落とすというより、空欄を排除した新しい DataFrame を作ると言った方がよいはずなので、時間がかかるのだろうと考えています。
dropna()を行うと id が変わっているのでこちらの考えも正しいでしょう。

疑問

新しくメモリ領域を確保して DataFrame を作るならば、もとの DataFrame に空欄が多い方が早いのではないかと考えたのですが、そのような挙動は確認できませんでした。
なぜだかは分かりません。 データ量の問題なのでしょうか?