Skip to content

Commit 08ff65f

Browse files
authored
BUG: merge between partial index and index fails when result is empty (#34414)
1 parent 8c4d7cd commit 08ff65f

File tree

3 files changed

+15
-2
lines changed

3 files changed

+15
-2
lines changed

doc/source/whatsnew/v1.3.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ Groupby/resample/rolling
295295

296296
Reshaping
297297
^^^^^^^^^
298+
- Bug in :func:`merge` raising error when performing an inner join with partial index and ``right_index`` when no overlap between indices (:issue:`33814`)
298299
- Bug in :meth:`DataFrame.unstack` with missing levels led to incorrect index names (:issue:`37510`)
299300
- Bug in :func:`join` over :class:`MultiIndex` returned wrong result, when one of both indexes had only one level (:issue:`36909`)
300301
- Bug in :func:`concat` incorrectly casting to ``object`` dtype in some cases when one or more of the operands is empty (:issue:`38843`, :issue:`38907`)

pandas/core/reshape/merge.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -864,9 +864,9 @@ def _maybe_add_join_keys(self, result, left_indexer, right_indexer):
864864
mask_left = left_indexer == -1
865865
mask_right = right_indexer == -1
866866
if mask_left.all():
867-
key_col = rvals
867+
key_col = Index(rvals)
868868
elif right_indexer is not None and mask_right.all():
869-
key_col = lvals
869+
key_col = Index(lvals)
870870
else:
871871
key_col = Index(lvals).where(~mask_left, rvals)
872872

pandas/tests/reshape/merge/test_merge.py

+12
Original file line numberDiff line numberDiff line change
@@ -2375,3 +2375,15 @@ def test_merge_right_left_index():
23752375
}
23762376
)
23772377
tm.assert_frame_equal(result, expected)
2378+
2379+
2380+
def test_merge_result_empty_index_and_on():
2381+
# GH#33814
2382+
df1 = DataFrame({"a": [1], "b": [2]}).set_index(["a", "b"])
2383+
df2 = DataFrame({"b": [1]}).set_index(["b"])
2384+
expected = DataFrame({"a": [], "b": []}, dtype=np.int64).set_index(["a", "b"])
2385+
result = merge(df1, df2, left_on=["b"], right_index=True)
2386+
tm.assert_frame_equal(result, expected)
2387+
2388+
result = merge(df2, df1, left_index=True, right_on=["b"])
2389+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)