Skip to content

Commit 0da0066

Browse files
committed
BUG: fix merge bug with left joins on length-0 DataFrame, close #1628
1 parent 5753816 commit 0da0066

File tree

4 files changed

+29
-3
lines changed

4 files changed

+29
-3
lines changed

RELEASE.rst

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ pandas 0.8.1
9797
- Fix Series.max/min and Series.describe on len-0 series (#1650)
9898
- Handle None values in dict passed to concat (#1649)
9999
- Fix Series.interpolate with method='values' and DatetimeIndex (#1646)
100+
- Fix IndexError in left merges on a DataFrame with 0-length (#1628)
100101

101102
pandas 0.8.0
102103
============

pandas/src/join.pyx

+8-2
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,14 @@ def full_outer_join(ndarray[int64_t] left, ndarray[int64_t] right,
186186
def _get_result_indexer(sorter, indexer):
187187
if indexer.dtype != np.int_:
188188
indexer = indexer.astype(np.int_)
189-
res = sorter.take(indexer)
190-
np.putmask(res, indexer == -1, -1)
189+
if len(sorter) > 0:
190+
res = sorter.take(indexer)
191+
np.putmask(res, indexer == -1, -1)
192+
else:
193+
# length-0 case
194+
res = np.empty(len(indexer), dtype=np.int64)
195+
res.fill(-1)
196+
191197
return res
192198

193199

pandas/tools/merge.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ def _get_merge_keys(self):
294294
right_keys = []
295295
join_names = []
296296
right_drop = []
297+
left_drop = []
297298
left, right = self.left, self.right
298299

299300
is_lkey = lambda x: isinstance(x, np.ndarray) and len(x) == len(left)
@@ -314,7 +315,11 @@ def _get_merge_keys(self):
314315
if not is_rkey(rk):
315316
right_keys.append(right[rk].values)
316317
if lk == rk:
317-
right_drop.append(rk)
318+
# avoid key upcast in corner case (length-0)
319+
if len(left) > 0:
320+
right_drop.append(rk)
321+
else:
322+
left_drop.append(lk)
318323
else:
319324
right_keys.append(rk)
320325
left_keys.append(left[lk].values)
@@ -348,6 +353,9 @@ def _get_merge_keys(self):
348353
else:
349354
left_keys = [self.left.index.values]
350355

356+
if left_drop:
357+
self.left = self.left.drop(left_drop, axis=1)
358+
351359
if right_drop:
352360
self.right = self.right.drop(right_drop, axis=1)
353361

pandas/tools/tests/test_merge.py

+11
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,17 @@ def test_merge_non_unique_index_many_to_many(self):
648648
index=[dt2, dt2, dt3, dt, dt])
649649
_check_merge(df1, df2)
650650

651+
def test_left_merge_empty_dataframe(self):
652+
left = DataFrame({'key': [1], 'value': [2]})
653+
right = DataFrame({'key': []})
654+
655+
result = merge(left, right, on='key', how='left')
656+
assert_frame_equal(result, left)
657+
658+
result = merge(right, left, on='key', how='right')
659+
assert_frame_equal(result, left)
660+
661+
651662
def _check_merge(x, y):
652663
for how in ['inner', 'left', 'outer']:
653664
result = x.join(y, how=how)

0 commit comments

Comments
 (0)