結論
pandas.merge()の引数の順番に気を付けましょう!!
もっと詳しく
pandasのmergeは引数として書かれるDataFrameの順番によって、結合後のDataFrameの順番が変わります。
「先に書いた方(left)のDataFrameを基準」に、後に書いたもの(right)が共通項をもとに順番が入れ替わってくっつくためです。
この仕様、言われてみれば「そりゃそうじゃ」という話ですがお恥ずかしながらわたくし、一度やらかしかけました。
pandas.merge()の公式ドキュメントはこちら:
https://pandas.pydata.org/docs/reference/api/pandas.merge.html
具体例
以下のような2つのDataFrameがあるとします。
import pandas as pd
df = pd.DataFrame({'column1':['a', 'b', 'c']}, index=['row1', 'row2', 'row3'])
df2 = pd.DataFrame({'column1':['b', 'c', 'a'], 'column2':['bb', 'cc', 'aa']}, index=['row1', 'row2', 'row3'])
これらをmerge関数で結合するときに(1つ目と2つ目の引数の順番に注目!)
df_merged = pd.merge(df2, df, on=['column1'], how='inner') # 先に書かれているdf2が基準になる
で、これに気付かずに
「dfは上から'a,b,c'の順になっていたはず!じゃあその通りの順にcolumn4を作っちゃうぞ~^^」
とかやるとですね。
df_merged['column3'] = ['aaa', 'bbb', 'ccc']
こうなってしまいます。アルファベットがずれていますね。
もちろん以下のようにすればアルファベットがそろいます。
df_merged = pd.merge(df, df2, on=['column1', 'column2'], how='inner') # df→df2の順になっている
df_merged['column3'] = ['aaa', 'bbb', 'ccc']
df_merged
(やったー!)
まとめ
今回は単なるアルファベットという順番やずれがわかりやすいもので例示しましたが、実際には順番とかわからない数字や文字列だったりするわけですね(実体験)。で、ずれてしまったまま気付かずにスルーしてた可能性もあるわけで……。
皆様もmergeの引数に……というか、単純なミスにはお気を付けくださいませ!