From f607a10ac69cc5d53a40c3f68599c67ea4f342b9 Mon Sep 17 00:00:00 2001 From: 01-vyom Date: Fri, 21 May 2021 01:22:54 +0530 Subject: [PATCH 1/2] ENH: Deprecate non-keyword arguments for MultiIndex.set_levels --- doc/source/whatsnew/v1.3.0.rst | 1 + pandas/core/indexes/multi.py | 2 ++ pandas/tests/indexes/multi/test_get_set.py | 29 +++++++++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v1.3.0.rst b/doc/source/whatsnew/v1.3.0.rst index 1eb22436204a8..2b81ae80f26b9 100644 --- a/doc/source/whatsnew/v1.3.0.rst +++ b/doc/source/whatsnew/v1.3.0.rst @@ -649,6 +649,7 @@ Deprecations - Deprecated behavior of :meth:`DatetimeIndex.union` with mixed timezones; in a future version both will be cast to UTC instead of object dtype (:issue:`39328`) - Deprecated using ``usecols`` with out of bounds indices for ``read_csv`` with ``engine="c"`` (:issue:`25623`) - Deprecated passing arguments as positional (except for ``"method"``) in :meth:`DataFrame.interpolate` and :meth:`Series.interpolate` (:issue:`41485`) +- Deprecated passing arguments as positional (except for ``"levels"``) in :meth:`MultiIndex.set_levels` (:issue:`41485`) .. --------------------------------------------------------------------------- diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 1a3719233a1da..cc6c3c3fdb0f9 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -41,6 +41,7 @@ from pandas.util._decorators import ( Appender, cache_readonly, + deprecate_nonkeyword_arguments, doc, ) @@ -807,6 +808,7 @@ def _set_levels( self._reset_cache() + @deprecate_nonkeyword_arguments(version=None, allowed_args=["self", "levels"]) def set_levels( self, levels, level=None, inplace=None, verify_integrity: bool = True ): diff --git a/pandas/tests/indexes/multi/test_get_set.py b/pandas/tests/indexes/multi/test_get_set.py index 0c561395788ad..98fe0fada0bb6 100644 --- a/pandas/tests/indexes/multi/test_get_set.py +++ b/pandas/tests/indexes/multi/test_get_set.py @@ -351,7 +351,7 @@ def test_set_levels_categorical(ordered): index = MultiIndex.from_arrays([list("xyzx"), [0, 1, 2, 3]]) cidx = CategoricalIndex(list("bac"), ordered=ordered) - result = index.set_levels(cidx, 0) + result = index.set_levels(cidx, level=0) expected = MultiIndex(levels=[cidx, [0, 1, 2, 3]], codes=index.codes) tm.assert_index_equal(result, expected) @@ -405,3 +405,30 @@ def test_set_levels_inplace_deprecated(idx, inplace): with tm.assert_produces_warning(FutureWarning): idx.set_levels(levels=new_level, level=1, inplace=inplace) + + +def test_set_levels_pos_args_deprecation(): + # https://github.com/pandas-dev/pandas/issues/41485 + idx = MultiIndex.from_tuples( + [ + (1, "one"), + (2, "one"), + (3, "one"), + ], + names=["foo", "bar"], + ) + msg = ( + r"In a future version of pandas all arguments of MultiIndex.set_levels except " + r"for the arguments 'levels' will be keyword-only" + ) + with tm.assert_produces_warning(FutureWarning, match=msg): + result = idx.set_levels(["a", "b", "c"], 0) + expected = MultiIndex.from_tuples( + [ + ("a", "one"), + ("b", "one"), + ("c", "one"), + ], + names=["foo", "bar"], + ) + tm.assert_index_equal(result, expected) From a13c8acb0774d857f7dfdaf4d77d0008a466a243 Mon Sep 17 00:00:00 2001 From: 01-vyom Date: Sun, 23 May 2021 16:03:58 +0530 Subject: [PATCH 2/2] BUG: Changed stack levels and test message string --- pandas/core/indexes/multi.py | 2 +- pandas/tests/indexes/multi/test_get_set.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index cc6c3c3fdb0f9..e39a6cd672bde 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -900,7 +900,7 @@ def set_levels( warnings.warn( "inplace is deprecated and will be removed in a future version.", FutureWarning, - stacklevel=2, + stacklevel=3, ) else: inplace = False diff --git a/pandas/tests/indexes/multi/test_get_set.py b/pandas/tests/indexes/multi/test_get_set.py index 98fe0fada0bb6..9657e74c363b9 100644 --- a/pandas/tests/indexes/multi/test_get_set.py +++ b/pandas/tests/indexes/multi/test_get_set.py @@ -419,7 +419,7 @@ def test_set_levels_pos_args_deprecation(): ) msg = ( r"In a future version of pandas all arguments of MultiIndex.set_levels except " - r"for the arguments 'levels' will be keyword-only" + r"for the argument 'levels' will be keyword-only" ) with tm.assert_produces_warning(FutureWarning, match=msg): result = idx.set_levels(["a", "b", "c"], 0)