Skip to content

Commit 4b1ccf6

Browse files
tracks refs in to_frame
1 parent b2a1428 commit 4b1ccf6

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

pandas/core/internals/managers.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1889,7 +1889,8 @@ def to_2d_mgr(self, columns: Index) -> BlockManager:
18891889
bp = BlockPlacement(0)
18901890
new_blk = type(blk)(arr, placement=bp, ndim=2)
18911891
axes = [columns, self.axes[0]]
1892-
return BlockManager([new_blk], axes=axes, verify_integrity=False)
1892+
refs = [weakref.ref(blk)]
1893+
return BlockManager([new_blk], axes=axes, refs=refs, verify_integrity=False)
18931894

18941895
def _has_no_reference(self, i: int = 0) -> bool:
18951896
"""

pandas/tests/copy_view/test_methods.py

+28-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import numpy as np
22

3-
from pandas import DataFrame
3+
from pandas import (
4+
DataFrame,
5+
Series,
6+
)
47
import pandas._testing as tm
58

69

@@ -136,14 +139,36 @@ def test_select_dtypes(using_copy_on_write):
136139
df2._mgr._verify_integrity()
137140

138141
# currently this always returns a "view"
139-
assert np.may_share_memory(df2["a"].values, df["a"].values)
142+
assert np.shares_memory(df2["a"].values, df["a"].values)
140143

141144
# mutating df2 triggers a copy-on-write for that column/block
142145
df2.iloc[0, 0] = 0
143146
if using_copy_on_write:
144-
assert not np.may_share_memory(df2["a"].values, df["a"].values)
147+
assert not np.shares_memory(df2["a"].values, df["a"].values)
145148
tm.assert_frame_equal(df, df_orig)
146149
else:
147150
# but currently select_dtypes() actually returns a view -> mutates parent
148151
df_orig.iloc[0, 0] = 0
149152
tm.assert_frame_equal(df, df_orig)
153+
154+
155+
def test_to_frame(using_copy_on_write):
156+
# Case: converting a Series to a DataFrame with to_frame
157+
ser = Series([1, 2, 3])
158+
ser_orig = ser.copy()
159+
160+
df = ser.to_frame()
161+
162+
# currently this always returns a "view"
163+
assert np.shares_memory(ser.values, df._get_column_array(0))
164+
165+
df.iloc[0, 0] = 0
166+
167+
if using_copy_on_write:
168+
# mutating df triggers a copy-on-write for that column
169+
assert not np.shares_memory(ser.values, df[0].values)
170+
tm.assert_series_equal(ser, ser_orig)
171+
else:
172+
# but currently select_dtypes() actually returns a view -> mutates parent
173+
ser_orig.iloc[0] = 0
174+
tm.assert_series_equal(ser, ser_orig)

0 commit comments

Comments
 (0)