エンジニアライフスタイルブログを運営しているミウラ(@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関数で結合している例です。
1 |
pd.merge(df1, df2) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
すべての列名をキーとするので、両方のDataFrameに存在する「氏名」「クラス」はそのまま結合されています。
そして、「数学」「国語」は片方にしか存在しないので、それぞれ結合されています。
つまり、外部結合(outer join)していることがわかります。
明示的にキーを指定(on)
merge関数で明示的にキーを指定するためには、引数onを使用します。
【Pythonコード】
「氏名」をキーに結合している例です。
1 |
pd.merge(df1, df2, on='氏名') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
「氏名」をキーにしたので、「氏名」で結合されていることがわかります。
一方、「クラス」はどうでしょうか。
両方のDataFrameに「クラス」は含まれますが、キーに指定していないため、別物として「クラス_x」「クラス_y」という名前に自動的にサフィックスが付いて結合されます。
サフィックスを指定(suffixes)
先程の例のように結合するときにキー以外に同じ列名があると、自動的にサフィックスを付けて結合します。
このサフィックスは、引数suffixesを使って事前に指定することができます。
【Pythonコード】
左右のDataFrameがわかるように、左のDataFrameのサフィックスには「_left」、右のDataFrameのサフィックスには「_right」を付けている例です。
1 |
pd.merge(df1, df2, on='氏名', suffixes=['_left', '_right']) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
「クラス_x」と「クラス_y」という自動的につけられた名前から「クラス_left」と「クラス_right」に変化したことがわかります。
異なる列名をキーに横方向の結合(left_on, right_on)
左右のDataFrameでキーとしたい列名が異なる場合には、引数left_onと引数right_onで列名を指定します。
【Pythonコード】
左のDataFrameの「氏名」列、右のDataFrameの「名前」列をキーとして結合する例です。
1 |
pd.merge(df1, df3, left_on='氏名', right_on='名前') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
左のDataFrameの「氏名」列、右のDataFrameの「名前」列をキーとして結合できていることがわかります。
列名をキーにして縦方向に結合
pandas.merge関数やpandas.DataFrame.mergeメソッドでは、縦方向に結合することはできません。
縦方向に結合したい場合は、別記事で解説しているpandas.concat関数を使用します。
結合方法を指定(how)
merge関数で結合方法を指定するには、引数howを使用します。
内部結合(inner join)
内部結合によって左右のDataFrameでお互い一致するデータを残します。
【Pythonコード】
2つのDataFrameをmerge関数で内部結合している例です。
1 |
pd.merge(df1, df5, on='氏名', how='inner') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
内部結合した結果、キーとした「氏名」列で共通する「三浦」「田中」のレコードが残っていることがわかります。
左結合(left join)
左結合によって左のDataFrameに一致するデータを残します。
【Pythonコード】
2つのDataFrameをmerge関数で左結合している例です。
1 |
pd.merge(df1, df5, on='氏名', how=‘left') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
左結合した結果、キーとした「氏名」列において左のDataFrameの「三浦」「田中」「鈴木」「佐藤」のレコードが残っていることがわかります。
右結合(right join)
右結合によって右のDataFrameに一致するデータを残します。
【Pythonコード】
2つのDataFrameをmerge関数で右結合している例です。
1 |
pd.merge(df1, df5, on='氏名', how=‘right') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
右結合した結果、キーとした「氏名」列において右のDataFrameの「三浦」「田中」「渡辺」「加藤」のレコードが残っていることがわかります。
外部結合(outer join)
外部結合によって左右両方のDataFrameのデータを残します。
【Pythonコード】
2つのDataFrameをmerge関数で外部結合している例です。
1 |
pd.merge(df1, df5, on='氏名', how=‘outer') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
外部結合した結果、キーとした「氏名」列で「三浦」「田中」「鈴木」「佐藤」「渡辺」「加藤」の左右すべてのレコードが残っていることがわかります。
左右データの情報を取得(indicator=True)
DataFrameの結合結果で左右どちらのデータかわかるようにするには、引数indicatorを使用します。
【Pythonコード】
引数indicatorを使用している例です。
1 |
pd.merge(df1, df5, on='氏名', how=‘outer’, indicator=True) |
【表示結果】
上記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関数で結合している例です。
1 |
pd.merge(df4, df6, right_index=True, left_index=True) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
「氏名」が書かれた列をインデックスとした2つのDataFrameを結合しています。
left_on/right_onと組み合わせて結合
インデックスをキーにしたDataFrameと、列名をキーにしたDataFrameを結合することもできます。
このとき、引数「left_index / right_index」と「left_on / right_on」を組み合わせて使います。
【Pythonコード】
left_indexとright_onを組み合わせて結合している例です。
1 |
pd.merge(df6, df2, left_index=True, right_on='氏名') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
インデックスをキーとした左のDataFrameと、「氏名」列をキーとした右のDataFrameをmerge関数で結合できていることがわかります。
【Pythonコード】
left_onとright_indexを組み合わせて結合している例です。
1 |
pd.merge(df2, df6, left_on='氏名’, right_index=True) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
「氏名」列をキーとした左のDataFrameと、インデックスをキーとした右のDataFrameをmerge関数で結合できていることがわかります。
pandas.DataFrame.joinメソッドでも結合可能
インデックスをキーに結合する方法として、pandas.DataFrame.joinメソッドを使用することも可能です。
mergeと同時にキー列でソート(sort)
mergeと同時にキー列でソートする方法を紹介します。
mergeと同時にキー列で並び替えが可能
mergeと同時にキー列でソートするには、引数sortを使用します。
【Pythonコード】
引数sortを使って結合している例です。
1 |
pd.merge(df6, df2, left_index=True, right_on='氏名', sort=True) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
merge関数の引数に「sort=True」を指定することで、キーとした列で(昇順に)ソートされています。
merge後にキー列で並び替えも可能
merge関数を実行と同時にソートする方法を紹介しましたが、もちろんmerge関数後にキーとした列でソートすることも可能です。
【Pythonコード】
merge関数を実行後にソートしている例です。
1 2 |
df_test = pd.merge(df6, df2, left_index=True, right_on='氏名') df_test.sort_values(by='氏名') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
merge関数で結合したDataFrameを変数に代入し、sort_valuesメソッドでソートすれば同じことが可能です。
Pandasの並び替え(ソート)については、以下の記事にまとめているので、ぜひご覧ください。
【関連記事】
【TIPS】Pandasで行や列を並び替える方法まとめ(DataFrame/Series)
まとめ
いかがでしたでしょうか。
Pandasのmerge関数を使って結合・連結する方法を紹介してきました。
データ分析の分野でPandasが必須になっているため、本記事のようにDataFrameを結合する操作を習得することも非常に重要です。
そして、Pandasの操作にはもっと色々な操作がありますので、ぜひ学んでマスターしていきましょう。