【Python】PandasのDataFrameの組み合わせ- merge(), join(), concate()による結合

Pandas
スポンサーリンク

Pythonの拡張モジュールPandasのDataFrameの操作をしてきましたが、複数のDataFrameを組み合わせる必要がある場面も出てきます。

PandasにはDataFramesを組み合わせる方法として、主に3つの方法があります。ここでは、merge(), Join(), concate()を使って組み合わせの方法を見て行こうと思います。

スポンサーリンク

concat()

まずはconcat()から見ていきましょう。

concat()を使えば、基本的にDataFrameをつなぎ合わせることができます。ただし、連結するデータの次元が一致する必要があることに注意が必要です。

jupyter notebookでPythonを起動してpandasをインポートしてます。例として次のようなDataFrameを3つ作ってみます。

import pandas as pd

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                        'B': ['B0', 'B1', 'B2'],
                        'C': ['C0', 'C1', 'C2']},
                        index=[0, 1, 2])

df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],
                        'B': ['B3', 'B4', 'B5'],
                        'C': ['C3', 'C4', 'C5']},
                         index=[3, 4, 5]) 

df3 = pd.DataFrame({'A': ['A6', 'A7', 'A8'],
                        'B': ['B6', 'B7', 'B8'],
                        'C': ['C6', 'C7', 'C8']},
                        index=[6, 7, 8])

実行してみます。

それぞれのDataFrameを表示すると次のようになります。

pd.concat()にDataFrameのリストを渡して、連結することができます。

次のように先に用意した3つのDataFrameをリストで渡してみます。

pd.concat([df1,df2,df3])

columnが全て揃っているので縦方向に連結されているのがわかります。

同じconcat()にaxis=1を渡すことで、横軸方向に連結することができます。

pd.concat([df1,df2,df3],axis=1)

columnが横に連結される形になっていますが、インデックスが揃った値ではないので該当しない部分にはNaNが入れられて表示されています。

スポンサーリンク

merge()

次はmerge()を扱ってみます。

merge()を使用すると、SQLテーブルをmergeするのと同様のロジックを使用してDataFrameを連結することができます。

次のような共通のキーを持つ単純なDataFrameを2つ用意してみます。

df_left = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 
                        'A': ['A0', 'A1', 'A2'],
                        'B': ['B0', 'B1', 'B2']})
   
df_right = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 
                         'C': ['C0', 'C1', 'C2'], 
                         'D': ['D0', 'D1', 'D2']})

それぞれのDataFrameを次のように表示されます。

この2つのDataFrameをmerge()に渡して連結してみます。

pd.merge(df_left,df_right)

次元も揃っているのでキーを共通にして連結されています。これは見やすくてわかりやすいと思います。

では、今度は次のように複雑なDataFrameを作ってみます。

df_left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                        'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3']})
    
df_right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'], 
                         'key2': ['K0', 'K0', 'K0', 'K0'], 
                         'C': ['C0', 'C1', 'C2', 'C3'],
                         'D': ['D0', 'D1', 'D2', 'D3']})

2つのキーが共通していますが、その値はそれぞれ違います。

それぞれ表示すると次のようになります。

この2つのDataFrameをこれまでと同様にmerge()してみます。

pd.merge(df_left, df_right)

2つのDataFrameに共通しているkey1, key2を軸に連結されますが、さらにそのkey1, key2の値でどちらにも共通している値を持つ部分でされています。

この複雑なDataFrameをさらに違う操作で値を取得することができます。それには、howキーワードとonキーワードを使います。

onキーワードで明示的に列名を与えて、howキーワードにouterを指定して外部結合させてみます。

pd.merge(df_left, df_right, how='outer', on=['key1', 'key2'])

全ての要素が結合されて、値の無い部分にNaNが入れられているのがわかります。集合和の形ですね。

このhowにはleft, rightを指定して、それぞれ左、右のデータセットに存在する行に合わせてデータを結合できます。

まずhow=’right’で右結合してみましょう。

pd.merge(df_left, df_right, how='right', on=['key1', 'key2'])

df_rightのkey1, key2に合わせて結合されているのがわかります。要素の無い部分にはNaNが入っています。

今度はhow=’left’で左結合してみます。

pd.merge(df_left, df_right, how='left', on=['key1', 'key2'])

df_leftのkey1, key2に合わせて結合され、要素の無い部分にNaNが入っています。

スポンサーリンク

join()

最後にJoin()を見ていきます。

join()は異なるインデックスを持つ2つのDataFrameを1つに結合する方法です。

次のindexの異なる2つのDataFrameを用意します。

df_left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                     'B': ['B0', 'B1', 'B2']},
                      index=['K0', 'K1', 'K2']) 

df_right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
                    'D': ['D0', 'D2', 'D3']},
                      index=['K0', 'K2', 'K3'])

DataFrameをjoin()で結合するには次のように行ないます。

df_left.join(df_right)

df_leftのインデックスに合わせて結合されているのがわかります。

今度はこれに、how=’outer’を指定して外部結合させてみます。

df_left.join(df_right, how='outer')

要素の無い部分にNaNを入れて、2つのDataFrameが全て結合されているのがわかります。

スポンサーリンク

最後に

ここでは、Pythonの拡張モジュールPandasのDataFrameの結合を見てきました。

PandasにはDataFramesを組み合わせる方法として主に3つの方法があります。

concate()、merge()、Join()の3つです。

これらを使ってDataFremeの結合を見てきましたが、それぞれの機能の特徴をよく理解しましょう。

タイトルとURLをコピーしました