背景
複数のデータフレームからcsvに出力するようにデータをまとめる処理をしていた時に少しハマったトラブルについて。
調べたらすぐわかるような初歩的なことなんですが、意識していなかったなと反省して記事に残します。
やりたかった処理
データフレーム1のカラムを指定して、その中のデータと同じデータが存在する行だけデータフレーム2から取り出し、新しいデータフレーム3に格納する。
コードに直すと
df3['新しいカラム'] = df2[df2['ALL_ID'].isin(df1['target_ID'])]['代入したいカラム']
こんな感じ。
ALL_IDにはかならずtarget_IDで指定したいIDが含まれており、df2のtarget_IDの'代入したいカラム'のデータをまるっとdf3に'新しいカラム'として代入したいのですが、この処理をするとdf3ではNaNが発生して期待通りになりませんでした。
改善方法
reset_index(drop=True)を入れるだけです。
df3['新しいカラム'] = df2[df2['ALL_ID'].isin(df1['target_ID'])].reset_index(drop=True)['代入したいカラム']
isin()の処理でインデックスが破壊される(というか元のデータフレームのインデックスをそのまま持ってくる)ので、df1とdf2のそれぞれのインデックスが対応せずにNaNが代入されてしまうと言う話でした。
まとめ
結局この方法は採用していないです。
上の例でいうとデータフレーム1と2をmergeしてから処理する方が可読性的にもコード書く上でも何回もreset_index書く手間が省けるので。
インデックスのこと蔑ろにすると思わぬところでミスると言う戒めになりました。