pandas’s reindex method doesn’t work as expected!?
今日は小話です。(というか、個人的トラブルシュートの備忘録です。)
Python の pandas は、前回の Streamlit ネタでも活用していますが、今まで泥ナワ的に使っており、基本をちゃんと勉強したことがありませんでした。何か困ったときに毎回、Stack Overflow で解決策を探すのは非効率なので、基礎から勉強を始めました。
そんな折、ちょっとしたトラブルにはまりました。pandas には reindex という、Series や DataFrame のためのメソッドがあるのですが、これが期待通りに動かない(気がした)のです。
課題
いま、こんな DataFrame があるとします。
>>> df
b c d e
100 NaN NaN NaN NaN
110 NaN NaN NaN NaN
120 1.0 1.0 1.0 1.0
130 NaN NaN NaN NaN
140 NaN NaN NaN NaN
私は、これに reindex を適用したら、NaN を補完できるのかと思ってました。(勘違いしていました。)
>>> df.reindex(fill_value=0.0)
b c d e
100 NaN NaN NaN NaN
110 NaN NaN NaN NaN
120 1.0 1.0 1.0 1.0
130 NaN NaN NaN NaN
140 NaN NaN NaN NaN
これは動きません!
答え
reindex というのは、あくまでも新しいインデックスを与えて Series や DataFrame を再構築するためのものです。そして、その際に指定する fill_value や method は、新たしく追加されるインデックスに対してしか働きません!
次の例を見てみましょう。
>>> df.reindex(df.index.append(pd.Index([150])), fill_value=0.0)
b c d e
100 NaN NaN NaN NaN
110 NaN NaN NaN NaN
120 1.0 1.0 1.0 1.0
130 NaN NaN NaN NaN
140 NaN NaN NaN NaN
150 0.0 0.0 0.0 0.0
追加したインデックス 150 にしか、fill_value は効いていませんね。
もし、既存の DataFrame の NaN を埋めたかったら、次のようにしなくてはいけません。
>>> df.fillna(0.0)
b c d e
100 0.0 0.0 0.0 0.0
110 0.0 0.0 0.0 0.0
120 1.0 1.0 1.0 1.0
130 0.0 0.0 0.0 0.0
140 0.0 0.0 0.0 0.0
私は悩みに悩み、思わず、初めて Stack Overflow に投稿してしまおうかと思ったくらいです。(とほほ)
今日はここまで。