パンダのmerge()とconcat()の違い


89

間に本質的な違い(S)何pd.DataFrame.merge()とはpd.concat()

これまでのところ、これは私が見つけたものです。私の理解がどれほど完全で正確であるかについてコメントしてください。

  • .merge()列(および行インデックス)のみを使用でき、データベーススタイルの操作に意味的に適しています。.concat()インデックスのみを使用して、どちらの軸でも使用でき、階層インデックスを追加するためのオプションを提供します。

  • ちなみに、これにより次の冗長性が可能になります。どちらも行インデックスを使用して2つのデータフレームを組み合わせることができます。

  • pd.DataFrame.join() のユースケースのサブセットの省略形を提供するだけです .merge()

(Pandasは、データ分析の非常に幅広いユースケースに対応するのに優れています。ドキュメントを調べて、特定のタスクを実行するための最良の方法を見つけるのは少し難しいかもしれません。)


3
:また、関連stackoverflow.com/a/37891437/1972495周りの議論を.merge()して.join()
WindChimes 2016

2
マージ、結合、および連結では、この答えは、それらすべてを使用して同じことを行う方法について非常に明確であることがわかります(これらは同じ機能の単なる代替インターフェースのようです)。あなたの質問(そしてあなたがコメントでリンクしている答え)のおかげで、私はついにマージと結合がどのように関連しているかを理解しました。concatが別の実装を使用しているかどうかはまだ
わかり

回答:


79

非常に高いレベルの違いはmerge()、共通の列の値に基づいて2つ(またはそれ以上)のデータフレームを結合するために使用され(インデックスも使用、使用left_index=True、および/またはright_index=True)、concat()1つ(または複数)のデータフレームを1つ追加するために使用されることです。他の下(またはaxisオプションが0または1に設定されているかどうかに応じて横向き)。

join()インデックスに基づいて2つのデータフレームをマージするために使用されます。merge()オプションで使用する代わりに、を使用left_index=Trueできますjoin()

例えば:

df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)})

df1:
   Key  data1
0   b   0
1   b   1
2   a   2
3   c   3
4   a   4
5   a   5
6   b   6

df2 = pd.DataFrame({'Key': ['a', 'b', 'd'], 'data2': range(3)})

df2:
    Key data2
0   a   0
1   b   1
2   d   2

#Merge
# The 2 dataframes are merged on the basis of values in column "Key" as it is 
# a common column in 2 dataframes

pd.merge(df1, df2)

   Key data1 data2
0   b    0    1
1   b    1    1
2   b    6    1
3   a    2    0
4   a    4    0
5   a    5    0

#Concat
# df2 dataframe is appended at the bottom of df1 

pd.concat([df1, df2])

   Key data1 data2
0   b   0     NaN
1   b   1     NaN
2   a   2     NaN
3   c   3     NaN
4   a   4     NaN
5   a   5     NaN
6   b   6     NaN
0   a   Nan   0
1   b   Nan   1
2   d   Nan   2

つまり、これは、の引数howmerge機能し、それが行うものとはまったく異なることを意味しconcatますか?
HemanthBakaya20年

11

pd.concatIterable引数としてを取ります。したがって、DataFramesを引数として直接取ることができません。また、Dimensionのsは、DataFrame連結中に軸に沿って一致する必要があります。

pd.mergeDataFramesを引数として取ることができDataFrame、同じ列またはインデックスを持つ2つのsを組み合わせるために使用されます。これはpd.concat、DataFrameに繰り返される列が表示されるため、使用できません。

一方、joinはDataFrame、異なるインデックスを持つ2つのを結合するために使用できます。


7
連結するときに寸法が一致する必要があると述べているので、この回答が好きです。concatいくつかのデータフレームを互いに上/隣に接着するだけです。同じ列が2回だけ表示されるという意味では、コンテンツを認識していません。一方、列が同じ場合、merge実際には列がマージされます。
jorijnsmit 2018

3
私はそれが真実ではないと思います。上記の回答(@Abhishek Sawantによる)でさえ、concat寸法が一致しない場所の例を示しています。
michcio12 3419

7

私は現在、との本質的な違いを理解しようpd.DataFrame.merge()としていpd.concat()ます。

いい質問です。主な違い:

pd.concat 両方の軸で動作します。

他の違いは、されpd.concatている内側のデフォルト外側の間には、唯一参加しpd.DataFrame.merge()外側内側のデフォルトが参加します。

3番目の注目すべき他の違いは次のとおりです。pd.DataFrame.merge()同じ名前の列をマージするときに列のサフィックスを設定するオプションがありますが、pd.concatこれは不可能です。


ではpd.concat、デフォルトで使用するには、(複数のデータフレームの列をスタックすることができますaxis=0)、あなたが設定したときaxis=1、あなたは模倣するpd.DataFrame.merge()機能を。

のいくつかの有用な例pd.concat

df2=pd.concat([df]*2, ignore_index=True) #double the rows of a dataframe

df2=pd.concat([df, df.iloc[[0]]]) # add first row to the end

df3=pd.concat([df1,df2], join='inner', ignore_index=True) # concat two df's

6

大まかに:

  • .concat()単に複数DataFrameを垂直に積み重ねるか、インデックスに合わせた後に水平にステッチします
  • .merge()最初に2つDataFrameの選択された共通の列またはインデックスを整列し、次にそれぞれの整列された行から残りの列を取得しますDataFrame

より具体的には.concat()

  • トップレベルのパンダ機能です
  • 2つ以上のパンダをDataFrame 垂直または水平に組み合わせる
  • 揃えのみインデックスに水平に組み合わせます
  • のいずれかにDataFrame重複インデックスが含まれている場合のエラー。
  • デフォルトは外部結合で、内部結合のオプションがあります

そして.merge()

  • トップレベルのパンダ関数とDataFrameメソッドの両方として存在します(パンダ1.0以降)
  • 正確に2つをDataFrame水平方向に組み合わせる
  • 呼び出し元DataFrameの列またはインデックスを他DataFrameの列またはインデックスに 揃えます
  • デカルト積を実行することにより、結合列またはインデックスの重複値を処理します
  • デフォルトは内部結合で、左、外、右のオプションがあります

を実行するときに、結合列またはインデックスからの同じ値を含む2つの行があるpd.merge(left, right)場合left、各行はrightの対応する行と結合され、デカルト積になることに注意してください。一方、.concat()を使用して列を結合する場合は、重複するインデックスがどちらにも存在しないことを確認する必要がありますDataFrame

実際には:

  • 考えてみましょう.concat()均質を組み合わせたときに最初にDataFrame検討しながら、.merge()補完的に組み合わせたときに最初DataFrame
  • 垂直方向にマージする必要がある場合は、を使用し.concat()ます。列を介して水平方向にマージする必要がある場合は.merge()、を使用します。これは、デフォルトで共通の列にマージされます。

参照:パンダ1.xクックブック


2

mergeとconcatの主な違いは、mergeを使用すると、concatの使用がより広範で構造化されていない、より構造化されたテーブルの「結合」を実行できることです。

マージ

参照マニュアルを参照してpd.DataFrame.mergeかかる権利あなたには、いくつかの構造の事前定義された結合操作に応じて、左側のテーブルと右側のテーブルを結合して、それを考えることができる必須の引数として。パラメータrightの定義に注意してください。

必要なパラメーター

  • :DataFrameまたは名前付きシリーズ

オプションのパラメータ

  • 方法:{'左'、 '右'、 '外側'、 '内側'}デフォルト '内側'
  • 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.DataFramepd.Series

出力

  • 戻り値:DataFrame

さらに、パンダでのマージ操作のドキュメント文字列を確認すると、次のようになります。

列をキーまたは行インデックスとして使用して、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])

# Performing operations on default

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オブジェクトの名前)または行インデックスを使用します。これらのエンティティのみを使用するため、データフレームまたはシリーズの水平マージを実行し、結果として垂直操作を適用しません。

もっと見たい場合は、ソースコードを少し深く掘り下げることができます。


0

concat関数のみがaxisパラメーターを持っています。マージは、共有列の値に基づいてデータフレームを並べて結合するために使用されるため、軸パラメーターは必要ありません。


-2

デフォルト:
joinは列方向の左結合です
pd.mergeは列方向の内部結合です
pd.concatは行方向の外部結合です

pd.concat:
反復可能な引数を取ります。したがって、DataFrameを直接取得することはできません([df、df2]を使用)
DataFrameの寸法は軸に沿って一致する必要があります

結合とpd.merge:
DataFrame引数を取ることができます

以下のコードが同じことをする理由を理解するために画像をクリックしてください

df1.join(df2)
pd.merge(df1, df2, left_index=True, right_index=True)
pd.concat([df1, df2], axis=1)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.