1
0

mergeで結合したDataFrameの行の順番が変だと慌てたけれど単純なミスだったという話

Last updated at Posted at 2023-11-30

結論

pandas.merge()の引数の順番に気を付けましょう!!

もっと詳しく

pandasのmergeは引数として書かれるDataFrameの順番によって、結合後のDataFrameの順番が変わります。
「先に書いた方(left)のDataFrameを基準」に、後に書いたもの(right)が共通項をもとに順番が入れ替わってくっつくためです。
df_merge.png

この仕様、言われてみれば「そりゃそうじゃ」という話ですがお恥ずかしながらわたくし、一度やらかしかけました。

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'])

image.png
image.png
これらをmerge関数で結合するときに(1つ目と2つ目の引数の順番に注目!)

df_merged = pd.merge(df2, df, on=['column1'], how='inner') # 先に書かれているdf2が基準になる

としてしまうと
image.png
まあ、こうなりますね。

で、これに気付かずに
「dfは上から'a,b,c'の順になっていたはず!じゃあその通りの順にcolumn4を作っちゃうぞ~^^」
とかやるとですね。

df_merged['column3'] = ['aaa', 'bbb', 'ccc']

image.png

こうなってしまいます。アルファベットがずれていますね。

もちろん以下のようにすればアルファベットがそろいます。

df_merged = pd.merge(df, df2, on=['column1', 'column2'], how='inner') # df→df2の順になっている

image.png

df_merged['column3'] = ['aaa', 'bbb', 'ccc']
df_merged

image.png

(やったー!)

まとめ

今回は単なるアルファベットという順番やずれがわかりやすいもので例示しましたが、実際には順番とかわからない数字や文字列だったりするわけですね(実体験)。で、ずれてしまったまま気付かずにスルーしてた可能性もあるわけで……。

皆様もmergeの引数に……というか、単純なミスにはお気を付けくださいませ!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0