Python

【TIPS】Pandasのmerge関数でDataFrameを結合する方法まとめ

 

エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。

 

普段はフリーランスでシステムエンジニアをしております。

 

今回は、こちらの前回記事に引き続いて、Pythonでデータ分析の支援を行うPandasのDataFrameを結合・連結する操作について、使い方をまとめてみました。

 

なお、本記事内のPythonソースコードは、JupyterLabで動作を確認しているので、同様に動作確認したい方はこちらの記事も参照し、まずはJupyterLabの環境構築をおこなってください。

 

 

Pandasの結合・連結

 

Pandasの結合・連結とは、2つのDataFrameを結合・連結したりすることを言います。

 

Pandasの結合・連結する前に知っておきたいことをいくつか説明していきます。

 

左と右のデータフレームで区別

 

2つのDataFrameを結合するとき、「左のDataFrame」と「右のDataFrame」という区別をするので覚えておきましょう。

 

 

結合方法(内部結合/左結合/右結合/外部結合)

 

PandasでDataFrameを結合する方法として、データベースの結合方法と同様に以下の4つが存在します。

 

 

それぞれの結合方法の概要は、以下のとおりです。

 

結合方法 説明
内部結合
(inner join)
左右のDataFrameでお互い一致するデータを残す結合方法です。
左結合
(left join)
左のDataFrameに一致するデータを残す結合方法です。
右結合
(right join)
右のDataFrameに一致するデータを残す結合方法です。
外部結合
(outer join)
左右両方のDataFrameのデータを残す結合方法です。

 

 

PandasでDataFrameを結合する関数(merge/concat)

 

PandasでDataFrameを結合する関数として、大きくmerge関数とconcat関数の2つが存在します。

 

本記事では、merge関数の使い方を紹介していきます。

 

pandas.merge関数とpandas.DataFrame.mergeメソッド

 

Pandasのmergeには、pandas.merge関数とpandas.DataFrame.mergeメソッドの2つがあります。

 

pandas.merge関数は、引数に左右のDataFrameオブジェクトを指定する必要があります。

 

それに対してpandas.DataFrame.mergeメソッドは、DataFrameオブジェクトのメソッドであるため、引数に片方(右)のDataFrameオブジェクトだけ指定するという違いがあります。

 

この違い以外は同じ引数で使い方も同じであるため、本記事ではpandas.merge関数の使い方を例として紹介していきたいと思います。

 

 

Pandasのmerge関数の使い方まとめ

 

merge関数は、列名(カラム)をキーに2つのデータフレームを1つに結合します。

 

列名をキーにして横方向に結合

 

列名をキーにして横方向に結合する方法を紹介していきます。

 

デフォルトですべての列がキーとする

 

merge関数で単純に2つのDataFrameを指定した場合、デフォルトで両方のDataFrameのすべての列名をキーとして結合します。

 

【Pythonコード】

 

2つのDataFrameをmerge関数で結合している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

すべての列名をキーとするので、両方のDataFrameに存在する「氏名」「クラス」はそのまま結合されています。

 

そして、「数学」「国語」は片方にしか存在しないので、それぞれ結合されています。

 

つまり、外部結合(outer join)していることがわかります。

 

 

明示的にキーを指定(on)

 

merge関数で明示的にキーを指定するためには、引数onを使用します。

 

【Pythonコード】

 

「氏名」をキーに結合している例です。

 

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

「氏名」をキーにしたので、「氏名」で結合されていることがわかります。

 

一方、「クラス」はどうでしょうか。

 

両方のDataFrameに「クラス」は含まれますが、キーに指定していないため、別物として「クラス_x」「クラス_y」という名前に自動的にサフィックスが付いて結合されます。

 

 

サフィックスを指定(suffixes)

 

先程の例のように結合するときにキー以外に同じ列名があると、自動的にサフィックスを付けて結合します。

 

このサフィックスは、引数suffixesを使って事前に指定することができます。

 

【Pythonコード】

 

左右のDataFrameがわかるように、左のDataFrameのサフィックスには「_left」、右のDataFrameのサフィックスには「_right」を付けている例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

「クラス_x」と「クラス_y」という自動的につけられた名前から「クラス_left」と「クラス_right」に変化したことがわかります。

 

 

異なる列名をキーに横方向の結合(left_on, right_on)

 

 

左右のDataFrameでキーとしたい列名が異なる場合には、引数left_onと引数right_onで列名を指定します。

 

【Pythonコード】

 

左のDataFrameの「氏名」列、右のDataFrameの「名前」列をキーとして結合する例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

左のDataFrameの「氏名」列、右のDataFrameの「名前」列をキーとして結合できていることがわかります。

 

 

列名をキーにして縦方向に結合

 

pandas.merge関数やpandas.DataFrame.mergeメソッドでは、縦方向に結合することはできません。

 

縦方向に結合したい場合は、別記事で解説しているpandas.concat関数を使用します。

 

 

結合方法を指定(how)

 

merge関数で結合方法を指定するには、引数howを使用します。

 

内部結合(inner join)

 

内部結合によって左右のDataFrameでお互い一致するデータを残します。

 

【Pythonコード】

 

2つのDataFrameをmerge関数で内部結合している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

内部結合した結果、キーとした「氏名」列で共通する「三浦」「田中」のレコードが残っていることがわかります。

 

 

左結合(left join)

 

左結合によって左のDataFrameに一致するデータを残します。

 

【Pythonコード】

 

2つのDataFrameをmerge関数で左結合している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

左結合した結果、キーとした「氏名」列において左のDataFrameの「三浦」「田中」「鈴木」「佐藤」のレコードが残っていることがわかります。

 

 

右結合(right join)

 

右結合によって右のDataFrameに一致するデータを残します。

 

【Pythonコード】

 

2つのDataFrameをmerge関数で右結合している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

右結合した結果、キーとした「氏名」列において右のDataFrameの「三浦」「田中」「渡辺」「加藤」のレコードが残っていることがわかります。

 

 

外部結合(outer join)

 

外部結合によって左右両方のDataFrameのデータを残します。

 

【Pythonコード】

 

2つのDataFrameをmerge関数で外部結合している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

外部結合した結果、キーとした「氏名」列で「三浦」「田中」「鈴木」「佐藤」「渡辺」「加藤」の左右すべてのレコードが残っていることがわかります。

 

 

左右データの情報を取得(indicator=True)

 

DataFrameの結合結果で左右どちらのデータかわかるようにするには、引数indicatorを使用します。

 

【Pythonコード】

 

引数indicatorを使用している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

「indicator=True」を指定することで、結合結果に「_merge」という列名が追加されました。

 

「_merge」列によって「both」は両方のDataFrame、「left_only」は左のDataFrame、「right_only」は右のDataFrameだけに存在することがわかります。

 

 

インデックスをキーにして横方向に結合(left_index/right_index)

 

インデックスをキーにして結合する方法を紹介します。

 

left_index/right_indexでインデックスをキーに結合

 

インデックスをキーにして結合するには、引数left_index、引数right_indexを使用します。

 

【Pythonコード】

 

インデックスをキーにして2つのDataFrameをmerge関数で結合している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

「氏名」が書かれた列をインデックスとした2つのDataFrameを結合しています。

 

 

left_on/right_onと組み合わせて結合

 

インデックスをキーにしたDataFrameと、列名をキーにしたDataFrameを結合することもできます。

 

このとき、引数「left_index / right_index」と「left_on / right_on」を組み合わせて使います。

 

【Pythonコード】

 

left_indexとright_onを組み合わせて結合している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

インデックスをキーとした左のDataFrameと、「氏名」列をキーとした右のDataFrameをmerge関数で結合できていることがわかります。

 

 

【Pythonコード】

 

left_onとright_indexを組み合わせて結合している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

「氏名」列をキーとした左のDataFrameと、インデックスをキーとした右のDataFrameをmerge関数で結合できていることがわかります。

 

 

pandas.DataFrame.joinメソッドでも結合可能

 

インデックスをキーに結合する方法として、pandas.DataFrame.joinメソッドを使用することも可能です。

 

 

mergeと同時にキー列でソート(sort)

 

mergeと同時にキー列でソートする方法を紹介します。

 

mergeと同時にキー列で並び替えが可能

 

mergeと同時にキー列でソートするには、引数sortを使用します。

 

【Pythonコード】

 

引数sortを使って結合している例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

merge関数の引数に「sort=True」を指定することで、キーとした列で(昇順に)ソートされています。

 

 

merge後にキー列で並び替えも可能

 

merge関数を実行と同時にソートする方法を紹介しましたが、もちろんmerge関数後にキーとした列でソートすることも可能です。

 

【Pythonコード】

 

merge関数を実行後にソートしている例です。

 

 

【表示結果】

 

上記PythonコードのDataFrameを表示すると、以下のようになります。

 

 

 

merge関数で結合したDataFrameを変数に代入し、sort_valuesメソッドでソートすれば同じことが可能です。

 

Pandasの並び替え(ソート)については、以下の記事にまとめているので、ぜひご覧ください。

 

【関連記事】

【TIPS】Pandasで行や列を並び替える方法まとめ(DataFrame/Series)

 

 

まとめ

 

いかがでしたでしょうか。

 

Pandasのmerge関数を使って結合・連結する方法を紹介してきました。

 

データ分析の分野でPandasが必須になっているため、本記事のようにDataFrameを結合する操作を習得することも非常に重要です。

 

そして、Pandasの操作にはもっと色々な操作がありますので、ぜひ学んでマスターしていきましょう。