1. ホーム
  2. パイソン

python] pandasライブラリのpd.merge関数を解説します。

2022-03-01 05:47:39
<パス

この記事では、joinとconcatenateのスプライシング手法に似たmergeの適用について詳しく説明します。

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
         left_index=False, right_index=False, sort=True,
         suffixes=('_x', '_y'), copy=True, indicator=False,
         validate=None)


パラメータは以下の通りです。

  • left: ステッチされた左側のDataFrameオブジェクト
  • right: スティッチングされた右側のデータフレームオブジェクト
  • on: 結合される列またはインデックスレベルの名前。左と右のDataFrameオブジェクトの両方に存在する必要がある。渡されず、left_index と right_index が False の場合、DataFrame 内の列の交差点が結合キーとして推論されます。
  • left_on:キーとして使用する左側のDataFrameのカラムまたはインデックスレベルです。列名、インデックスレベル名、またはDataFrameの長さに等しい長さの配列とすることができる。
  • right_on: キーとして使用する左側のDataFrameの列またはインデックスレベル。列名、インデックスレベル名、またはDataFrameの長さに等しい長さの配列とすることができる。
  • left_index。Trueの場合、左側のDataFrameのインデックス(行ラベル)が連結キーとして使用されます。MultiIndex(階層型)のDataFrameの場合、レベルの数は右側のDataFrameの連結キーの数と一致しなければならない。
  • right_index: left_index と同様の機能です。
  • どのように left', 'right', 'outer', 'inner ' のいずれか。innerは交差点、outerは和集合を取る。例えば、left: ['A','B','C']; right[''A,'C ','D']; inner は交差を取り、left に現れる A は right に現れる buy one A とマッチしてスプライスし、right でマッチしない場合は B 以外は失われます' outer' は併合を取り、現れた A は一つずつマッチして、同時に現れなかった分は足りない値に加えられることになります。
  • ソートします。結果のDataFrameを連結キーで辞書順に並べ替えます。デフォルトはTrueで、Falseに設定すると多くの場合、パフォーマンスが大幅に向上する。
  • サフィックス。重複する列のための文字列サフィックスタプル。デフォルトは(' x', ' y').
  • をコピーします。インデックスの再構築が必要ない場合でも、渡されたDataFrameオブジェクトから常にデータをコピーします(デフォルトはTrue)。
  • インジケータを使用します。出力されるDataFrameに_mergeという列を追加し、各行の出所に関する情報を持たせる。mergeはカテゴリタイプで、マージ・キーが "left"DataFrameにのみ現れるオブザベーションでは値 left_onlyをとり、マージ・キーが "right"DataFrameにのみ現れるオブザベーションでは値 right_only となります。またマージ・キーが両方にある場合は left_only になることがわかります。

1. 基本例です。

import pandas as pd

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                       'A': ['A0', 'A1', 'A2', 'A3'],
                       'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']})
result = pd.merge(left, right, on='key')

# The key passed in the on parameter is used as the join key
result
Out[4]: 
    A B key C D
0 A0 B0 K0 C0 D0
1 a1 b1 k1 c1 d1
2 A2 B2 K2 C2 D2
3 A3 B3 K3 C3 D3


2. 渡されるパラメータはリストです。

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                      'key2': ['K0', 'K1', 'K0', 'K1'],
                         'A': ['A0', 'A1', 'A2', 'A3'],
                         'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                         'C': ['C0', 'C1', 'C2', 'C3'],
                         'D': ['D0', 'D1', 'D2', 'D3']})

result = pd.merge(left, right, on=['key1', 'key2'])
# If two Keys are passed in at the same time, the correspondence will be done in the form of ['key1', 'key2'] lists. left's keys list is: [['K0', 'K0'], ['K0', 'K1'], ['K1', 'K0'], ['K2', 'K1']],
The list of keys left is: [['K0', 'K0'], ['K1', 'K0'], ['K1', 'K0'], ['K2', 'K0']], so there will be 1 ['K0', 'K0'] and 2 ['K1', 'K0'] corresponding to it.

result
Out[6]: 
    A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A2 B2 K1 K0 C1 D1
2 a2 b2 k1 k0 c2 d2


3. マージ方法
組み合わせキーが左または右のテーブルに現れない場合、結合テーブルの値はNAになります。

<テーブル マージ方法 SQLジョイン名 説明 左 LEFTOUTER JOIN 左フレームからのキーだけを使用する 右 右外部結合 右フレームからのキーだけを使用 外側 完全外部結合 両フレームのキーの和を使用 インナー INNER JOIN 両フレームのキーの交点を使用
result = pd.merge(left, right, how='left', on=['key1', 'key2'])
# Use keys from left frame only
result
Out[34]: 
    A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A1 B1 K0 K1 NaN NaN
2 A2 B2 K1 K0 C1 D1
3 A2 B2 K1 K0 C2 D2
4 A3 B3 K2 K1 NaN NaN

result = pd.merge(left, right, how='right', on=['key1', 'key2'])
# Use keys from right frame only
result
Out[36]: 
     A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A2 B2 K1 K0 C1 D1
2 A2 B2 K1 K0 C2 D2
3 NaN NaN K2 K0 C3 D3

result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
# Use intersection of keys from both frames 
result
Out[38]: 
     A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A1 B1 K0 K1 NaN NaN
2 A2 B2 K1 K0 C1 D1
3 A2 B2 K1 K0 C2 D2
4 A3 B3 K2 K1 NaN NaN
5 NaN NaN K2 K0 C3 D3
-----------------------------------------------------
left = pd.DataFrame({'A' : [1,2], 'B' : [2, 2]})
right = pd.DataFrame({'A' : [4,5,6], 'B': [2,2,2]})
result = pd.merge(left, right, on='B', how='outer')
result
Out[40]: 
   A_x B A_y
0 1 2 4
1 1 2 5
2 1 2 6
3 2 2 4
4 2 2 5
5 2 2 6



4. インジケータ・パラメータを渡す
mergeはパラメータindicatorを受け取ります。True の場合、_merge という名前の Categorical 型の列が、その値で出力オブジェクトに追加されます。

<テーブル 観測の起源 マージ値 マージキーは'left'フレームのみ 左のみ 右」フレームのみキーをマージする 右のみ マージキー入力 両フレーム
df1 = pd.DataFrame({'col1': [0, 1], 'col_left':['a', 'b']})
df2 = pd.DataFrame({'col1': [1, 2, 2], 'col_right':[2, 2, 2]})
pd.merge(df1, df2, on='col1', how='outer', indicator=True)

Out[44]: 
   col1 col_left col_right _merge
0 0.0 a NaN left_only
1 1.0 b 2.0 both
2 2.0 NaN 2.0 right_only
3 2.0 NaN 2.0 right_only


indicatorパラメータは文字列の引数も受け付けます。この場合、indicator関数は渡された文字列の値をindicatorカラムの名前として使用します。

pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
Out[45]: 
   col1 col_left col_right indicator_column
0 0.0 a NaN left_only
1 1.0 b 2.0 both
2 2.0 NaN 2.0 right_only
3 2.0 NaN 2.0 right_only


5.リンクキーとしてのインデックス
設定する必要のあるキーは、left_index= True と right_index= True の両方、または left_index を設定しながら right_on でキーを指定します。要するに、左右のリンクのキーを指定する必要があり、キー、インデックス、ミックスのいずれでもかまいません。

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
   .... : 'B': ['B0', 'B1', 'B2']},
   .... : index=['K0', 'K1', 'K2'])
   .... : 
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
   .... : 'D': ['D0', 'D2', 'D3']},
   .... : index=['K0', 'K2', 'K3'])
   .... : 

# Only K0, K2 have corresponding values
pd.merge(left,right,how= 'inner',left_index=True,right_index=True)
Out[51]: 
     A B C D
K0 A0 B0 C0 D0
K2 A2 B2 C2 D2


left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3'],
                   'key': ['K0', 'K1', 'K0', 'K1']})


right = pd.DataFrame({'C': ['C0', 'C1'],
                      'D': ['D0', 'D1']},
                    index=['K0', 'K1'])


result = pd.merge(left, right, left_on='key', right_index=True, how='left', sort=False)
# left_on='key', right_index=True
result
Out[54]: 
    A B key C D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K0 C0 D0
3 A3 B3 K1 C1 D1


6. ソートは、リンクのキー値をソートします。

Immediately following the previous example, set sort= True
result = pd.merge(left, right, left_on='key', right_index=True, how='left', sort=True)

result
Out[57]: 
    A B key C D
0 A0 B0 K0 C0 D0
2 A2 B2 K0 C0 D0
1 A1 B1 K1 C1 D1
3 A3 B3 K1 C1 D1


マルチプルインデックスについては、アプリケーションの数が少ないので、詳細な検討は行わず、必要であれば後で追加します。

一般に、マージシナリオはリンクされたキーに対して操作するもので、インデックスでもカラムでも良いが、実際のアプリケーションでは、左右のキー値が重複しないように注意しなければならず、トラブルの元となる。