diff --git a/pandas/tools/merge.py b/pandas/tools/merge.py index de4c7ca42cdb1..b54a84f2b9687 100644 --- a/pandas/tools/merge.py +++ b/pandas/tools/merge.py @@ -77,7 +77,7 @@ def get_result(self): join_index, left_indexer, right_indexer = self._get_join_info() # this is a bit kludgy - ldata, rdata = self._get_merge_data(self.join_names) + ldata, rdata = self._get_merge_data() # TODO: more efficiently handle group keys to avoid extra consolidation! join_op = _BlockJoinOperation([ldata, rdata], join_index, @@ -154,13 +154,19 @@ def _get_join_info(self): return join_index, left_indexer, right_indexer - def _get_merge_data(self, join_names): + def _get_merge_data(self): """ Handles overlapping column names etc. """ ldata, rdata = self.left._data, self.right._data lsuf, rsuf = self.suffixes - exclude_names = [x for x in join_names if x is not None] + exclude_names = set(x for x in self.join_names if x is not None) + if self.left_on is not None: + exclude_names -= set(c.name if hasattr(c, 'name') else c + for c in self.left_on) + if self.right_on is not None: + exclude_names -= set(c.name if hasattr(c, 'name') else c + for c in self.right_on) ldata, rdata = ldata._maybe_rename_join(rdata, lsuf, rsuf, exclude=exclude_names, copydata=False) diff --git a/pandas/tools/tests/test_merge.py b/pandas/tools/tests/test_merge.py index 232a18f78c286..eb4b1cc75de72 100644 --- a/pandas/tools/tests/test_merge.py +++ b/pandas/tools/tests/test_merge.py @@ -177,6 +177,14 @@ def test_handle_overlap(self): self.assert_('key1.foo' in joined) self.assert_('key1.bar' in joined) + def test_handle_overlap_arbitrary_key(self): + joined = merge(self.df, self.df2, + left_on='key2', right_on='key1', + suffixes=['.foo', '.bar']) + + self.assert_('key1.foo' in joined) + self.assert_('key2.bar' in joined) + def test_merge_common(self): joined = merge(self.df, self.df2) exp = merge(self.df, self.df2, on=['key1', 'key2'])