次のような2つのDataFrameがあるとします。
left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})
私はそれらをマージしたいので、次のようなものを試します:
pd.merge(left, right, left_on='key1', right_on='key2')
そして私は幸せです
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
しかし、私はjoinメソッドを使用しようとしています。
left.join(right, on=['key1', 'key2'])
そして、私はこれを取得します:
//anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _validate_specification(self)
406 if self.right_index:
407 if not ((len(self.left_on) == self.right.index.nlevels)):
--> 408 raise AssertionError()
409 self.right_on = [None] * n
410 Elif self.right_on is not None:
AssertionError:
私は何が欠けていますか?
私は常にインデックスでjoin
を使用します:
import pandas as pd
left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]}).set_index('key')
right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]}).set_index('key')
left.join(right, lsuffix='_l', rsuffix='_r')
val_l val_r
key
foo 1 4
bar 2 5
以下の列でmerge
を使用すると、同じ機能を使用できます。
left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]})
left.merge(right, on=('key'), suffixes=('_l', '_r'))
key val_l val_r
0 foo 1 4
1 bar 2 5
pandas.merge()
は、すべてのマージ/結合動作に使用される基になる関数です。
DataFramesは、pandas.DataFrame.merge()
の機能にアクセスする便利な方法として、pandas.DataFrame.join()
およびpandas.merge()
メソッドを提供します。たとえば、df1.merge(right=df2, ...)
はpandas.merge(left=df1, right=df2, ...)
と同等です。
これらは、df.join()
とdf.merge()
の主な違いです。
df1.join(df2)
は常にdf2
のインデックスを介して結合しますが、df1.merge(df2)
はdf2
の1つ以上の列(デフォルト)またはdf2
のインデックス(right_index=True
を使用)に結合できます。df1.join(df2)
はdf1
のインデックスを使用し、df1.merge(df2)
はdf1
の列を使用します。 df1.join(df2, on=key_or_keys)
またはdf1.merge(df2, left_index=True)
を指定することで上書きできます。df1.join(df2)
はデフォルトで左結合を行います(df1
のすべての行を保持します)が、df.merge
はデフォルトで内部結合を行います(一致するdf1
とdf2
の行のみを返します)。したがって、一般的なアプローチはpandas.merge(df1, df2)
またはdf1.merge(df2)
を使用することです。しかし、多くの一般的な状況(df1
のすべての行を保持し、df2
のインデックスに参加する場合)では、代わりにdf1.join(df2)
を使用して入力を節約できます。
http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging のドキュメントからこれらの問題に関するいくつかのメモ
merge
はpandas名前空間の関数であり、DataFrameインスタンスメソッドとしても使用できます。呼び出し側のDataFrameは、暗黙的に結合の左側のオブジェクトと見なされます。関連する
DataFrame.join
メソッドは、インデックスオンインデックス結合およびインデックスオンカラム結合のために内部でmerge
を使用しますが、共通カラムで結合しようとするのではなく、デフォルトでインデックスで結合します(merge
のデフォルトの動作)。インデックスに参加している場合は、DataFrame.join
を使用して入力を節約できます。
...
これら2つの関数呼び出しは完全に同等です。
left.join(right, on=key_or_keys) pd.merge(left, right, left_on=key_or_keys, right_index=True, how='left', sort=False)
join()
は単なる便利なメソッドだと思います。代わりにdf1.merge(df2)
を試してください。これにより、left_on
およびright_on
を指定できます。
In [30]: left.merge(right, left_on="key1", right_on="key2")
Out[30]:
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
pandasは、DataFrameオブジェクト間のすべての標準データベース結合操作のエントリポイントとして、単一の機能mergeを提供します。
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)
そして:
DataFrame.joinは、インデックスが異なる可能性のある2つのDataFrameの列を1つの結果のDataFrameに結合する便利な方法です。非常に基本的な例を次に示します。ここでのデータの配置は、インデックス(行ラベル)に基づいています。この同じ動作は、マージとインデックスを使用するように指示する追加の引数を使用して実現できます:result = pd.merge(left、right、left_index = True、right_index = True、how = 'outer')
違いの1つは、merge
が新しいインデックスを作成し、join
が左側のインデックスを保持していることです。 merge
を使用してインデックスが変更されないと誤って想定した場合、後の変換に大きな影響を与える可能性があります。
例えば:
import pandas as pd
df1 = pd.DataFrame({'org_index': [101, 102, 103, 104],
'date': [201801, 201801, 201802, 201802],
'val': [1, 2, 3, 4]}, index=[101, 102, 103, 104])
df1
date org_index val
101 201801 101 1
102 201801 102 2
103 201802 103 3
104 201802 104 4
-
df2 = pd.DataFrame({'date': [201801, 201802], 'dateval': ['A', 'B']}).set_index('date')
df2
dateval
date
201801 A
201802 B
-
df1.merge(df2, on='date')
date org_index val dateval
0 201801 101 1 A
1 201801 102 2 A
2 201802 103 3 B
3 201802 104 4 B
-
df1.join(df2, on='date')
date org_index val dateval
101 201801 101 1 A
102 201801 102 2 A
103 201802 103 3 B
104 201802 104 4 B
SQLの「パンダのマージは外部/内部の結合であり、Pandasの結合は自然な結合です」と同様です。したがって、pandasでマージを使用する場合は、使用するsqlish結合の種類を指定する必要がありますが、pandas joinを使用する場合は、一致する列ラベルを使用して結合する必要があります
df_1.join(df_2)
df_1.merge(df_2)
on
パラメーターは、両方の場合で異なる意味を持ちますdf_1.merge(df_2, on='column_1')
df_1.join(df_2, on='column_1') // It will throw error
df_1.join(df_2.set_index('column_1'), on='column_1')