Skip to content

Commit fc06497

Browse files
phoflluckyvs1
authored andcommitted
BUG: Join did not work correctly when one MultiIndex had only one level (pandas-dev#37208)
* BUG: join did not work correctly when one MultiIndex had only one level * Change pr number * Move whatsnew * Remove pd * Usef fixture * Remove len self
1 parent 007c8ce commit fc06497

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

doc/source/whatsnew/v1.3.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ Groupby/resample/rolling
296296
Reshaping
297297
^^^^^^^^^
298298
- Bug in :meth:`DataFrame.unstack` with missing levels led to incorrect index names (:issue:`37510`)
299+
- Bug in :func:`join` over :class:`MultiIndex` returned wrong result, when one of both indexes had only one level (:issue:`36909`)
299300
- 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`)
300301
-
301302

pandas/core/indexes/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1674,7 +1674,7 @@ def _drop_level_numbers(self, levnums: List[int]):
16741674
Drop MultiIndex levels by level _number_, not name.
16751675
"""
16761676

1677-
if not levnums:
1677+
if not levnums and not isinstance(self, ABCMultiIndex):
16781678
return self
16791679
if len(levnums) >= self.nlevels:
16801680
raise ValueError(

pandas/tests/indexes/multi/test_drop.py

+8
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,11 @@ def test_single_level_drop_partially_missing_elements():
180180
msg = r"labels \['a'\] not found in level"
181181
with pytest.raises(KeyError, match=msg):
182182
mi.drop([np.nan, 1, "a"], level=0)
183+
184+
185+
def test_droplevel_multiindex_one_level():
186+
# GH#37208
187+
index = pd.MultiIndex.from_tuples([(2,)], names=("b",))
188+
result = index.droplevel([])
189+
expected = pd.Int64Index([2], name="b")
190+
tm.assert_index_equal(result, expected)

pandas/tests/reshape/merge/test_join.py

+16
Original file line numberDiff line numberDiff line change
@@ -815,3 +815,19 @@ def test_join_cross(input_col, output_cols):
815815
result = left.join(right, how="cross", lsuffix="_x", rsuffix="_y")
816816
expected = DataFrame({output_cols[0]: [1, 1, 3, 3], output_cols[1]: [3, 4, 3, 4]})
817817
tm.assert_frame_equal(result, expected)
818+
819+
820+
def test_join_multiindex_one_level(join_type):
821+
# GH#36909
822+
left = DataFrame(
823+
data={"c": 3}, index=pd.MultiIndex.from_tuples([(1, 2)], names=("a", "b"))
824+
)
825+
right = DataFrame(
826+
data={"d": 4}, index=pd.MultiIndex.from_tuples([(2,)], names=("b",))
827+
)
828+
result = left.join(right, how=join_type)
829+
expected = DataFrame(
830+
{"c": [3], "d": [4]},
831+
index=pd.MultiIndex.from_tuples([(2, 1)], names=["b", "a"]),
832+
)
833+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)