Skip to content

Commit ee54b5f

Browse files
01-vyomTLouf
authored andcommitted
ENH: Deprecate non-keyword arguments for MultiIndex.set_levels (pandas-dev#41589)
1 parent 217c19a commit ee54b5f

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

doc/source/whatsnew/v1.3.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,7 @@ Deprecations
681681
- Deprecated passing arguments as positional in :meth:`DataFrame.clip` and :meth:`Series.clip` (other than ``"upper"`` and ``"lower"``) (:issue:`41485`)
682682
- Deprecated special treatment of lists with first element a Categorical in the :class:`DataFrame` constructor; pass as ``pd.DataFrame({col: categorical, ...})`` instead (:issue:`38845`)
683683
- Deprecated passing arguments as positional (except for ``"method"``) in :meth:`DataFrame.interpolate` and :meth:`Series.interpolate` (:issue:`41485`)
684+
- Deprecated passing arguments as positional (except for ``"levels"``) in :meth:`MultiIndex.set_levels` (:issue:`41485`)
684685
- Deprecated passing arguments as positional in :meth:`DataFrame.sort_index` and :meth:`Series.sort_index` (:issue:`41485`)
685686
- Deprecated passing arguments as positional in :meth:`DataFrame.drop_duplicates` (except for ``subset``), :meth:`Series.drop_duplicates`, :meth:`Index.drop_duplicates` and :meth:`MultiIndex.drop_duplicates`(:issue:`41485`)
686687
- Deprecated passing arguments (apart from ``value``) as positional in :meth:`DataFrame.fillna` and :meth:`Series.fillna` (:issue:`41485`)

pandas/core/indexes/multi.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,7 @@ def _set_levels(
804804

805805
self._reset_cache()
806806

807+
@deprecate_nonkeyword_arguments(version=None, allowed_args=["self", "levels"])
807808
def set_levels(
808809
self, levels, level=None, inplace=None, verify_integrity: bool = True
809810
):
@@ -895,7 +896,7 @@ def set_levels(
895896
warnings.warn(
896897
"inplace is deprecated and will be removed in a future version.",
897898
FutureWarning,
898-
stacklevel=2,
899+
stacklevel=3,
899900
)
900901
else:
901902
inplace = False

pandas/tests/indexes/multi/test_get_set.py

+28-1
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ def test_set_levels_categorical(ordered):
351351
index = MultiIndex.from_arrays([list("xyzx"), [0, 1, 2, 3]])
352352

353353
cidx = CategoricalIndex(list("bac"), ordered=ordered)
354-
result = index.set_levels(cidx, 0)
354+
result = index.set_levels(cidx, level=0)
355355
expected = MultiIndex(levels=[cidx, [0, 1, 2, 3]], codes=index.codes)
356356
tm.assert_index_equal(result, expected)
357357

@@ -405,3 +405,30 @@ def test_set_levels_inplace_deprecated(idx, inplace):
405405

406406
with tm.assert_produces_warning(FutureWarning):
407407
idx.set_levels(levels=new_level, level=1, inplace=inplace)
408+
409+
410+
def test_set_levels_pos_args_deprecation():
411+
# https://github.com/pandas-dev/pandas/issues/41485
412+
idx = MultiIndex.from_tuples(
413+
[
414+
(1, "one"),
415+
(2, "one"),
416+
(3, "one"),
417+
],
418+
names=["foo", "bar"],
419+
)
420+
msg = (
421+
r"In a future version of pandas all arguments of MultiIndex.set_levels except "
422+
r"for the argument 'levels' will be keyword-only"
423+
)
424+
with tm.assert_produces_warning(FutureWarning, match=msg):
425+
result = idx.set_levels(["a", "b", "c"], 0)
426+
expected = MultiIndex.from_tuples(
427+
[
428+
("a", "one"),
429+
("b", "one"),
430+
("c", "one"),
431+
],
432+
names=["foo", "bar"],
433+
)
434+
tm.assert_index_equal(result, expected)

0 commit comments

Comments
 (0)