Skip to content

Commit 80bdd41

Browse files
phoflnoatamir
authored andcommitted
DEP: Enforce set_values and set_codes inplace and positional args deprecation (pandas-dev#49084)
* DEP: Enforce set_values and set_codes inplace and positional args deprecation * Fix * Add whatsnew * Add test
1 parent ce1ae89 commit 80bdd41

File tree

8 files changed

+38
-220
lines changed

8 files changed

+38
-220
lines changed

doc/source/whatsnew/v2.0.0.rst

+2
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ Removal of prior version deprecations/changes
147147
- Remove argument ``squeeze`` from :meth:`DataFrame.groupby` and :meth:`Series.groupby` (:issue:`32380`)
148148
- Removed ``keep_tz`` argument in :meth:`DatetimeIndex.to_series` (:issue:`29731`)
149149
- Remove arguments ``names`` and ``dtype`` from :meth:`Index.copy` and ``levels`` and ``codes`` from :meth:`MultiIndex.copy` (:issue:`35853`, :issue:`36685`)
150+
- Remove argument ``inplace`` from :meth:`MultiIndex.set_levels` and :meth:`MultiIndex.set_codes` (:issue:`35626`)
151+
- Disallow passing positional arguments to :meth:`MultiIndex.set_levels` and :meth:`MultiIndex.set_codes` (:issue:`41485`)
150152
- Removed argument ``try_cast`` from :meth:`DataFrame.mask`, :meth:`DataFrame.where`, :meth:`Series.mask` and :meth:`Series.where` (:issue:`38836`)
151153
- Disallow passing non-round floats to :class:`Timestamp` with ``unit="M"`` or ``unit="Y"`` (:issue:`47266`)
152154
- Removed the ``numeric_only`` keyword from :meth:`Categorical.min` and :meth:`Categorical.max` in favor of ``skipna`` (:issue:`48821`)

pandas/core/indexes/multi.py

+6-44
Original file line numberDiff line numberDiff line change
@@ -852,10 +852,7 @@ def _set_levels(
852852

853853
self._reset_cache()
854854

855-
@deprecate_nonkeyword_arguments(version=None, allowed_args=["self", "levels"])
856-
def set_levels(
857-
self, levels, level=None, inplace=None, verify_integrity: bool = True
858-
):
855+
def set_levels(self, levels, *, level=None, verify_integrity: bool = True):
859856
"""
860857
Set new levels on MultiIndex. Defaults to returning new index.
861858
@@ -865,10 +862,6 @@ def set_levels(
865862
New level(s) to apply.
866863
level : int, level name, or sequence of int/level names (default None)
867864
Level(s) to set (None for all levels).
868-
inplace : bool
869-
If True, mutates in place.
870-
871-
.. deprecated:: 1.2.0
872865
verify_integrity : bool, default True
873866
If True, checks that levels and codes are compatible.
874867
@@ -940,30 +933,17 @@ def set_levels(
940933
>>> idx.set_levels([['a', 'b', 'c'], [1, 2, 3, 4]], level=[0, 1]).levels
941934
FrozenList([['a', 'b', 'c'], [1, 2, 3, 4]])
942935
"""
943-
if inplace is not None:
944-
warnings.warn(
945-
"inplace is deprecated and will be removed in a future version.",
946-
FutureWarning,
947-
stacklevel=find_stack_level(),
948-
)
949-
else:
950-
inplace = False
951936

952937
if is_list_like(levels) and not isinstance(levels, Index):
953938
levels = list(levels)
954939

955940
level, levels = _require_listlike(level, levels, "Levels")
956-
957-
if inplace:
958-
idx = self
959-
else:
960-
idx = self._view()
941+
idx = self._view()
961942
idx._reset_identity()
962943
idx._set_levels(
963944
levels, level=level, validate=True, verify_integrity=verify_integrity
964945
)
965-
if not inplace:
966-
return idx
946+
return idx
967947

968948
@property
969949
def nlevels(self) -> int:
@@ -1041,8 +1021,7 @@ def _set_codes(
10411021

10421022
self._reset_cache()
10431023

1044-
@deprecate_nonkeyword_arguments(version=None, allowed_args=["self", "codes"])
1045-
def set_codes(self, codes, level=None, inplace=None, verify_integrity: bool = True):
1024+
def set_codes(self, codes, *, level=None, verify_integrity: bool = True):
10461025
"""
10471026
Set new codes on MultiIndex. Defaults to returning new index.
10481027
@@ -1052,10 +1031,6 @@ def set_codes(self, codes, level=None, inplace=None, verify_integrity: bool = Tr
10521031
New codes to apply.
10531032
level : int, level name, or sequence of int/level names (default None)
10541033
Level(s) to set (None for all levels).
1055-
inplace : bool
1056-
If True, mutates in place.
1057-
1058-
.. deprecated:: 1.2.0
10591034
verify_integrity : bool, default True
10601035
If True, checks that levels and codes are compatible.
10611036
@@ -1101,25 +1076,12 @@ def set_codes(self, codes, level=None, inplace=None, verify_integrity: bool = Tr
11011076
(1, 'two')],
11021077
names=['foo', 'bar'])
11031078
"""
1104-
if inplace is not None:
1105-
warnings.warn(
1106-
"inplace is deprecated and will be removed in a future version.",
1107-
FutureWarning,
1108-
stacklevel=find_stack_level(),
1109-
)
1110-
else:
1111-
inplace = False
11121079

11131080
level, codes = _require_listlike(level, codes, "Codes")
1114-
1115-
if inplace:
1116-
idx = self
1117-
else:
1118-
idx = self._view()
1081+
idx = self._view()
11191082
idx._reset_identity()
11201083
idx._set_codes(codes, level=level, verify_integrity=verify_integrity)
1121-
if not inplace:
1122-
return idx
1084+
return idx
11231085

11241086
# --------------------------------------------------------------------
11251087
# Index Internals

pandas/tests/indexes/multi/test_compat.py

+2-15
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,12 @@ def test_inplace_mutation_resets_values():
5959
new_vals = mi1.set_levels(levels2).values
6060
tm.assert_almost_equal(vals2, new_vals)
6161

62-
# Non-inplace doesn't drop _values from _cache [implementation detail]
62+
# Doesn't drop _values from _cache [implementation detail]
6363
tm.assert_almost_equal(mi1._cache["_values"], vals)
6464

6565
# ...and values is still same too
6666
tm.assert_almost_equal(mi1.values, vals)
6767

68-
# Inplace should drop _values from _cache
69-
with tm.assert_produces_warning(FutureWarning):
70-
mi1.set_levels(levels2, inplace=True)
71-
assert "_values" not in mi1._cache
72-
tm.assert_almost_equal(mi1.values, vals2)
73-
7468
# Make sure label setting works too
7569
codes2 = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
7670
exp_values = np.empty((6,), dtype=object)
@@ -84,15 +78,8 @@ def test_inplace_mutation_resets_values():
8478
new_values = new_mi.values
8579
assert "_values" in new_mi._cache
8680

87-
# Not inplace shouldn't change
81+
# Shouldn't change cache
8882
tm.assert_almost_equal(mi2._cache["_values"], vals2)
8983

9084
# Should have correct values
9185
tm.assert_almost_equal(exp_values, new_values)
92-
93-
# ...and again setting inplace should drop _values from _cache, etc
94-
with tm.assert_produces_warning(FutureWarning):
95-
mi2.set_codes(codes2, inplace=True)
96-
assert "_values" not in mi2._cache
97-
tm.assert_almost_equal(mi2.values, new_values)
98-
assert "_values" in mi2._cache

pandas/tests/indexes/multi/test_duplicates.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,7 @@ def test_duplicate_multiindex_codes():
8787
mi = MultiIndex.from_arrays([["A", "A", "B", "B", "B"], [1, 2, 1, 2, 3]])
8888
msg = r"Level values must be unique: \[[AB', ]+\] on level 0"
8989
with pytest.raises(ValueError, match=msg):
90-
with tm.assert_produces_warning(FutureWarning):
91-
mi.set_levels([["A", "B", "A", "A", "B"], [2, 1, 3, -2, 5]], inplace=True)
90+
mi.set_levels([["A", "B", "A", "A", "B"], [2, 1, 3, -2, 5]])
9291

9392

9493
@pytest.mark.parametrize("names", [["a", "b", "a"], [1, 1, 2], [1, "a", 1]])

pandas/tests/indexes/multi/test_equivalence.py

+2-7
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,6 @@ def test_is_():
243243
assert mi.is_(mi2)
244244

245245
assert not mi.is_(mi.set_names(["C", "D"]))
246-
mi2 = mi.view()
247-
mi2.set_names(["E", "F"], inplace=True)
248-
assert mi.is_(mi2)
249246
# levels are inherent properties, they change identity
250247
mi3 = mi2.set_levels([list(range(10)), list(range(10))])
251248
assert not mi3.is_(mi2)
@@ -254,12 +251,10 @@ def test_is_():
254251
mi4 = mi3.view()
255252

256253
# GH 17464 - Remove duplicate MultiIndex levels
257-
with tm.assert_produces_warning(FutureWarning):
258-
mi4.set_levels([list(range(10)), list(range(10))], inplace=True)
254+
mi4 = mi4.set_levels([list(range(10)), list(range(10))])
259255
assert not mi4.is_(mi3)
260256
mi5 = mi.view()
261-
with tm.assert_produces_warning(FutureWarning):
262-
mi5.set_levels(mi5.levels, inplace=True)
257+
mi5 = mi5.set_levels(mi5.levels)
263258
assert not mi5.is_(mi)
264259

265260

0 commit comments

Comments
 (0)