Skip to content

Commit 7b8023f

Browse files
authored
BUG: set_levels not preserving categorical (#52177)
* BUG: set_levels not preserving categorical * Fix
1 parent e785998 commit 7b8023f

File tree

3 files changed

+15
-2
lines changed

3 files changed

+15
-2
lines changed

doc/source/whatsnew/v2.1.0.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ Missing
200200

201201
MultiIndex
202202
^^^^^^^^^^
203-
-
203+
- Bug in :meth:`MultiIndex.set_levels` not preserving dtypes for :class:`Categorical` (:issue:`52125`)
204204
-
205205

206206
I/O

pandas/core/indexes/multi.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
ABCDatetimeIndex,
7474
ABCTimedeltaIndex,
7575
)
76+
from pandas.core.dtypes.inference import is_array_like
7677
from pandas.core.dtypes.missing import (
7778
array_equivalent,
7879
isna,
@@ -945,7 +946,11 @@ def set_levels(
945946
FrozenList([['a', 'b', 'c'], [1, 2, 3, 4]])
946947
"""
947948

948-
if is_list_like(levels) and not isinstance(levels, Index):
949+
if isinstance(levels, Index):
950+
pass
951+
elif is_array_like(levels):
952+
levels = Index(levels)
953+
elif is_list_like(levels):
949954
levels = list(levels)
950955

951956
level, levels = _require_listlike(level, levels, "Levels")

pandas/tests/indexes/multi/test_get_set.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,3 +367,11 @@ def test_set_levels_pos_args_removal():
367367

368368
with pytest.raises(TypeError, match="positional arguments"):
369369
idx.set_codes([[0, 1], [1, 0]], 0)
370+
371+
372+
def test_set_levels_categorical_keep_dtype():
373+
# GH#52125
374+
midx = MultiIndex.from_arrays([[5, 6]])
375+
result = midx.set_levels(levels=pd.Categorical([1, 2]), level=0)
376+
expected = MultiIndex.from_arrays([pd.Categorical([1, 2])])
377+
tm.assert_index_equal(result, expected)

0 commit comments

Comments
 (0)