1. ホーム
  2. パイソン

[解決済み】Pandasのjoinとmergeの違いは何ですか?

2022-04-05 02:44:06

質問

このような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