[小ネタ] pandas の reindex() が期待通りに動かない!?

(更新

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 に投稿してしまおうかと思ったくらいです。(とほほ)

今日はここまで。

お問い合わせ(ないよな…)はお気軽に!

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。必ず返信致しますが、時々アドレス誤りと思われる返信エラーがございます。返答が届かない場合、大変お手数ではございますが別のメールアドレスで督促頂けますと幸いです。