Skip to content

Commit b241bde

Browse files
committed
Merge pull request #2965 from hayd/iss2843-left-join-on-na
BUG check both left and right indexers for None (fix 2843)
2 parents 78b6659 + 6a30753 commit b241bde

File tree

2 files changed

+38
-17
lines changed

2 files changed

+38
-17
lines changed

pandas/tools/merge.py

+20-17
Original file line numberDiff line numberDiff line change
@@ -209,23 +209,26 @@ def _maybe_add_join_keys(self, result, left_indexer, right_indexer):
209209
if name in result:
210210
key_col = result[name]
211211

212-
if name in self.left and left_indexer is not None:
213-
na_indexer = (left_indexer == -1).nonzero()[0]
214-
if len(na_indexer) == 0:
215-
continue
216-
217-
right_na_indexer = right_indexer.take(na_indexer)
218-
key_col.put(
219-
na_indexer, com.take_1d(self.right_join_keys[i],
220-
right_na_indexer))
221-
elif name in self.right and right_indexer is not None:
222-
na_indexer = (right_indexer == -1).nonzero()[0]
223-
if len(na_indexer) == 0:
224-
continue
225-
226-
left_na_indexer = left_indexer.take(na_indexer)
227-
key_col.put(na_indexer, com.take_1d(self.left_join_keys[i],
228-
left_na_indexer))
212+
if left_indexer is not None and right_indexer is not None:
213+
214+
if name in self.left:
215+
na_indexer = (left_indexer == -1).nonzero()[0]
216+
if len(na_indexer) == 0:
217+
continue
218+
219+
right_na_indexer = right_indexer.take(na_indexer)
220+
key_col.put(
221+
na_indexer, com.take_1d(self.right_join_keys[i],
222+
right_na_indexer))
223+
elif name in self.right:
224+
na_indexer = (right_indexer == -1).nonzero()[0]
225+
if len(na_indexer) == 0:
226+
continue
227+
228+
left_na_indexer = left_indexer.take(na_indexer)
229+
key_col.put(na_indexer, com.take_1d(self.left_join_keys[i],
230+
left_na_indexer))
231+
229232
elif left_indexer is not None:
230233
if name is None:
231234
name = 'key_%d' % i

pandas/tools/tests/test_merge.py

+18
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,24 @@ def test_merge_nosort(self):
717717

718718
self.assert_((df.var3.unique() == result.var3.unique()).all())
719719

720+
def test_merge_nan_right(self):
721+
df1 = DataFrame({"i1" : [0, 1], "i2" : [0, 1]})
722+
df2 = DataFrame({"i1" : [0], "i3" : [0]})
723+
result = df1.join(df2, on="i1", rsuffix="_")
724+
expected = DataFrame({'i1': {0: 0.0, 1: 1}, 'i2': {0: 0, 1: 1},
725+
'i1_': {0: 0, 1: np.nan}, 'i3': {0: 0.0, 1: np.nan},
726+
None: {0: 0, 1: 0}}).set_index(None).reset_index()[['i1', 'i2', 'i1_', 'i3']]
727+
assert_frame_equal(result, expected, check_dtype=False)
728+
729+
df1 = DataFrame({"i1" : [0, 1], "i2" : [0.5, 1.5]})
730+
df2 = DataFrame({"i1" : [0], "i3" : [0.7]})
731+
result = df1.join(df2, rsuffix="_", on='i1')
732+
expected = DataFrame({'i1': {0: 0, 1: 1}, 'i1_': {0: 0.0, 1: nan},
733+
'i2': {0: 0.5, 1: 1.5}, 'i3': {0: 0.69999999999999996,
734+
1: nan}})[['i1', 'i2', 'i1_', 'i3']]
735+
assert_frame_equal(result, expected)
736+
737+
720738
def test_overlapping_columns_error_message(self):
721739
# #2649
722740
df = DataFrame({'key': [1, 2, 3],

0 commit comments

Comments
 (0)