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になります。
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 型の列が、その値で出力オブジェクトに追加されます。
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
マルチプルインデックスについては、アプリケーションの数が少ないので、詳細な検討は行わず、必要であれば後で追加します。
一般に、マージシナリオはリンクされたキーに対して操作するもので、インデックスでもカラムでも良いが、実際のアプリケーションでは、左右のキー値が重複しないように注意しなければならず、トラブルの元となる。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例