Skip to content

Commit b29db1b

Browse files
authored
ENH: Add lazy copy to swaplevel (#50478)
1 parent 99859e4 commit b29db1b

File tree

3 files changed

+25
-6
lines changed

3 files changed

+25
-6
lines changed

pandas/core/frame.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7254,7 +7254,7 @@ def nsmallest(self, n: int, columns: IndexLabel, keep: str = "first") -> DataFra
72547254
),
72557255
)
72567256
def swaplevel(self, i: Axis = -2, j: Axis = -1, axis: Axis = 0) -> DataFrame:
7257-
result = self.copy()
7257+
result = self.copy(deep=None)
72587258

72597259
axis = self._get_axis_number(axis)
72607260

pandas/core/series.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4070,7 +4070,9 @@ def nsmallest(self, n: int = 5, keep: str = "first") -> Series:
40704070
dtype: object"""
40714071
),
40724072
)
4073-
def swaplevel(self, i: Level = -2, j: Level = -1, copy: bool = True) -> Series:
4073+
def swaplevel(
4074+
self, i: Level = -2, j: Level = -1, copy: bool | None = None
4075+
) -> Series:
40744076
"""
40754077
Swap levels i and j in a :class:`MultiIndex`.
40764078
@@ -4090,10 +4092,9 @@ def swaplevel(self, i: Level = -2, j: Level = -1, copy: bool = True) -> Series:
40904092
{examples}
40914093
"""
40924094
assert isinstance(self.index, MultiIndex)
4093-
new_index = self.index.swaplevel(i, j)
4094-
return self._constructor(self._values, index=new_index, copy=copy).__finalize__(
4095-
self, method="swaplevel"
4096-
)
4095+
result = self.copy(deep=copy)
4096+
result.index = self.index.swaplevel(i, j)
4097+
return result
40974098

40984099
def reorder_levels(self, order: Sequence[Level]) -> Series:
40994100
"""

pandas/tests/copy_view/test_methods.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,24 @@ def test_reorder_levels(using_copy_on_write):
425425
tm.assert_frame_equal(df, df_orig)
426426

427427

428+
@pytest.mark.parametrize("obj", [Series([1, 2, 3]), DataFrame({"a": [1, 2, 3]})])
429+
def test_swaplevel(using_copy_on_write, obj):
430+
index = MultiIndex.from_tuples([(1, 1), (1, 2), (2, 1)], names=["one", "two"])
431+
obj.index = index
432+
obj_orig = obj.copy()
433+
obj2 = obj.swaplevel()
434+
435+
if using_copy_on_write:
436+
assert np.shares_memory(obj2.values, obj.values)
437+
else:
438+
assert not np.shares_memory(obj2.values, obj.values)
439+
440+
obj2.iloc[0] = 0
441+
if using_copy_on_write:
442+
assert not np.shares_memory(obj2.values, obj.values)
443+
tm.assert_equal(obj, obj_orig)
444+
445+
428446
def test_frame_set_axis(using_copy_on_write):
429447
# GH 49473
430448
df = DataFrame({"a": [1, 2, 3], "b": [4, 5, 6], "c": [0.1, 0.2, 0.3]})

0 commit comments

Comments
 (0)