mergeとconcatの主な違いは、mergeを使用すると、concatの使用がより広範で構造化されていない、より構造化されたテーブルの「結合」を実行できることです。
マージ
参照マニュアルを参照して、pd.DataFrame.merge
かかる権利あなたには、いくつかの構造の事前定義された結合操作に応じて、左側のテーブルと右側のテーブルを結合して、それを考えることができる必須の引数として。パラメータrightの定義に注意してください。
必要なパラメーター
オプションのパラメータ
- 方法:{'左'、 '右'、 '外側'、 '内側'}デフォルト '内側'
- on:ラベルまたはリスト
- left_on:ラベルまたはリスト、または配列のような
- right_on:ラベルまたはリスト、または配列のような
- left_index:bool、デフォルトはFalse
- right_index:bool、デフォルトはFalse
- 並べ替え:bool、デフォルトはFalse
- 接尾辞:(str、str)のタプル、デフォルト( '_x'、 '_ y')
- コピー:bool、デフォルトはTrue
- インジケーター:boolまたはstr、デフォルトはFalse
- 検証:str、オプション
重要: または名前付きオブジェクトpd.DataFrame.merge
である権利が必要です。pd.DataFrame
pd.Series
出力
さらに、パンダでのマージ操作のドキュメント文字列を確認すると、次のようになります。
列をキーまたは行インデックスとして使用して、2つのDataFrameまたはSeriesオブジェクト間でデータベース(SQL)マージ操作を実行します
コンキャット
のドキュメントを参照してくださいpd.concat
。最初に、パラメータの名前はtable、data_frame、series、matrixなどではなく、objsであることに注意してください。つまり、次のように定義されている多くの「データコンテナ」を渡すことができます。
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
必要なパラメーター
- objs:SeriesまたはDataFrameオブジェクトのシーケンスまたはマッピング
オプションのパラメータ
- 軸:{0 / 'インデックス'、1 / '列'}、デフォルト0
- 結合:{'inner'、 'outer'}、デフォルト 'outer'
- ignore_index:bool、デフォルトはFalse
- キー:シーケンス、デフォルトなし
- レベル:シーケンスのリスト、デフォルトなし
- 名前:リスト、デフォルトなし
- verify_integrity:bool、デフォルトはFalse
- 並べ替え:bool、デフォルトはFalse
- コピー:bool、デフォルトはTrue
出力
例
コード
import pandas as pd
v1 = pd.Series([1, 5, 9, 13])
v2 = pd.Series([10, 100, 1000, 10000])
v3 = pd.Series([0, 1, 2, 3])
df_left = pd.DataFrame({
"v1": v1,
"v2": v2,
"v3": v3
})
df_right = pd.DataFrame({
"v4": [5, 5, 5, 5],
"v5": [3, 2, 1, 0]
})
df_concat = pd.concat([v1, v2, v3])
merge_result = df_left.merge(df_right, left_index=True, right_index=True)
concat_result = pd.concat([df_left, df_right], sort=False)
print(merge_result)
print('='*20)
print(concat_result)
コード出力
v1 v2 v3 v4 v5
0 1 10 0 5 3
1 5 100 1 5 2
2 9 1000 2 5 1
3 13 10000 3 5 0
====================
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
ただし、軸パラメータを変更することで、concatを使用した最初の出力(マージ)を実現できます。
concat_result = pd.concat([df_left, df_right], sort=False, axis=1)
次の動作を観察してください。
concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)
出力;
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
、単一のDataFrameまたは名前付きSeriesしか許可されないため、mergeで同様の操作を実行することはできません。
merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)
出力;
TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed
結論
すでにお気づきかもしれませんが、「マージ」と「連結」では入力と出力が異なる場合があります。
冒頭で述べたように、最初の(主な)違いは、「マージ」はオブジェクトとパラメータの制限されたセットでより構造化された結合を実行するのに対し、「コンキャット」はより広いセットでより厳密ではない/より広い結合を実行することですオブジェクトとパラメータの。
全体として、マージは変更/(入力)に対する耐性が低く、「連結」は変更/(入力)に対する耐性が緩い/感度が低くなります。「concat」を使用して「merge」を実現できますが、その逆は必ずしも当てはまりません。
「マージ」操作は、データフレーム列(またはpd.Series
オブジェクトの名前)または行インデックスを使用します。これらのエンティティのみを使用するため、データフレームまたはシリーズの水平マージを実行し、結果として垂直操作を適用しません。
もっと見たい場合は、ソースコードを少し深く掘り下げることができます。
.merge()
して.join()
。