Skip to content

Commit fde9d98

Browse files
phoflmeeseeksmachine
authored andcommitted
Backport PR pandas-dev#52001: BUG - CoW: Series with MultiIndex with tuples does not respect CoW
1 parent e28ba0e commit fde9d98

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

pandas/core/series.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,9 +1073,10 @@ def _get_values_tuple(self, key: tuple):
10731073

10741074
# If key is contained, would have returned by now
10751075
indexer, new_index = self.index.get_loc_level(key)
1076-
return self._constructor(self._values[indexer], index=new_index).__finalize__(
1077-
self
1078-
)
1076+
new_ser = self._constructor(self._values[indexer], index=new_index)
1077+
if using_copy_on_write() and isinstance(indexer, slice):
1078+
new_ser._mgr.add_references(self._mgr) # type: ignore[arg-type]
1079+
return new_ser.__finalize__(self)
10791080

10801081
def _get_values(self, indexer: slice | npt.NDArray[np.bool_]) -> Series:
10811082
new_mgr = self._mgr.getitem_mgr(indexer)

pandas/tests/copy_view/test_indexing.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,3 +1049,19 @@ def test_getitem_midx_slice(using_copy_on_write, using_array_manager):
10491049
if using_copy_on_write:
10501050
new_df.iloc[0, 0] = 100
10511051
tm.assert_frame_equal(df_orig, df)
1052+
1053+
1054+
def test_series_midx_tuples_slice(using_copy_on_write):
1055+
ser = Series(
1056+
[1, 2, 3],
1057+
index=pd.MultiIndex.from_tuples([((1, 2), 3), ((1, 2), 4), ((2, 3), 4)]),
1058+
)
1059+
result = ser[(1, 2)]
1060+
assert np.shares_memory(get_array(ser), get_array(result))
1061+
result.iloc[0] = 100
1062+
if using_copy_on_write:
1063+
expected = Series(
1064+
[1, 2, 3],
1065+
index=pd.MultiIndex.from_tuples([((1, 2), 3), ((1, 2), 4), ((2, 3), 4)]),
1066+
)
1067+
tm.assert_series_equal(ser, expected)

0 commit comments

Comments
 (0)