Skip to content

Commit 1c2de61

Browse files
authored
regression fix for merging DF with datetime index with empty DF (pandas-dev#36897)
1 parent 337bf20 commit 1c2de61

File tree

3 files changed

+56
-6
lines changed

3 files changed

+56
-6
lines changed

doc/source/whatsnew/v1.2.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,6 @@ MultiIndex
469469

470470
- Bug in :meth:`DataFrame.xs` when used with :class:`IndexSlice` raises ``TypeError`` with message ``"Expected label or tuple of labels"`` (:issue:`35301`)
471471
- Bug in :meth:`DataFrame.reset_index` with ``NaT`` values in index raises ``ValueError`` with message ``"cannot convert float NaN to integer"`` (:issue:`36541`)
472-
-
473472

474473
I/O
475474
^^^
@@ -536,6 +535,7 @@ Reshaping
536535
- Bug in :meth:`DataFrame.pivot` did not preserve :class:`MultiIndex` level names for columns when rows and columns both multiindexed (:issue:`36360`)
537536
- Bug in :func:`join` returned a non deterministic level-order for the resulting :class:`MultiIndex` (:issue:`36910`)
538537
- Bug in :meth:`DataFrame.combine_first()` caused wrong alignment with dtype ``string`` and one level of ``MultiIndex`` containing only ``NA`` (:issue:`37591`)
538+
- Fixed regression in :func:`merge` on merging DatetimeIndex with empty DataFrame (:issue:`36895`)
539539

540540
Sparse
541541
^^^^^^

pandas/core/reshape/merge.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -830,12 +830,15 @@ def _maybe_add_join_keys(self, result, left_indexer, right_indexer):
830830
rvals = algos.take_1d(take_right, right_indexer, fill_value=rfill)
831831

832832
# if we have an all missing left_indexer
833-
# make sure to just use the right values
834-
mask = left_indexer == -1
835-
if mask.all():
833+
# make sure to just use the right values or vice-versa
834+
mask_left = left_indexer == -1
835+
mask_right = right_indexer == -1
836+
if mask_left.all():
836837
key_col = rvals
838+
elif mask_right.all():
839+
key_col = lvals
837840
else:
838-
key_col = Index(lvals).where(~mask, rvals)
841+
key_col = Index(lvals).where(~mask_left, rvals)
839842

840843
if result._is_label_reference(name):
841844
result[name] = key_col

pandas/tests/reshape/merge/test_multi.py

+48-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import pytest
33

44
import pandas as pd
5-
from pandas import DataFrame, Index, MultiIndex, Series
5+
from pandas import DataFrame, Index, MultiIndex, Series, Timestamp
66
import pandas._testing as tm
77
from pandas.core.reshape.concat import concat
88
from pandas.core.reshape.merge import merge
@@ -481,6 +481,53 @@ def test_merge_datetime_index(self, klass):
481481
result = df.merge(df, on=[df.index.year], how="inner")
482482
tm.assert_frame_equal(result, expected)
483483

484+
@pytest.mark.parametrize("merge_type", ["left", "right"])
485+
def test_merge_datetime_multi_index_empty_df(self, merge_type):
486+
# see gh-36895
487+
488+
left = DataFrame(
489+
data={
490+
"data": [1.5, 1.5],
491+
},
492+
index=MultiIndex.from_tuples(
493+
[[Timestamp("1950-01-01"), "A"], [Timestamp("1950-01-02"), "B"]],
494+
names=["date", "panel"],
495+
),
496+
)
497+
498+
right = DataFrame(
499+
index=MultiIndex.from_tuples([], names=["date", "panel"]), columns=["state"]
500+
)
501+
502+
expected_index = MultiIndex.from_tuples(
503+
[[Timestamp("1950-01-01"), "A"], [Timestamp("1950-01-02"), "B"]],
504+
names=["date", "panel"],
505+
)
506+
507+
if merge_type == "left":
508+
expected = DataFrame(
509+
data={
510+
"data": [1.5, 1.5],
511+
"state": [None, None],
512+
},
513+
index=expected_index,
514+
)
515+
results_merge = left.merge(right, how="left", on=["date", "panel"])
516+
results_join = left.join(right, how="left")
517+
else:
518+
expected = DataFrame(
519+
data={
520+
"state": [None, None],
521+
"data": [1.5, 1.5],
522+
},
523+
index=expected_index,
524+
)
525+
results_merge = right.merge(left, how="right", on=["date", "panel"])
526+
results_join = right.join(left, how="right")
527+
528+
tm.assert_frame_equal(results_merge, expected)
529+
tm.assert_frame_equal(results_join, expected)
530+
484531
def test_join_multi_levels(self):
485532

486533
# GH 3662

0 commit comments

Comments
 (0)