Skip to content

Commit 14bfc65

Browse files
committed
Fix bugs, should work for 1-D
1 parent 8bb54ce commit 14bfc65

File tree

2 files changed

+29
-23
lines changed

2 files changed

+29
-23
lines changed

pandas/core/internals/managers.py

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,12 +1211,8 @@ def value_getitem(placement):
12111211
return value[placement.indexer]
12121212

12131213
# Accessing public blknos ensures the public versions are initialized
1214-
# print(f"Loc is {loc}")
12151214
blknos = self.blknos[loc]
1216-
# print(f"Blknos is {blknos}")
12171215
blklocs = self.blklocs[loc].copy()
1218-
# print(f"Blklocs is {blklocs}")
1219-
# print(f"Blocks is {self.blocks}")
12201216

12211217
unfit_mgr_locs = []
12221218
unfit_val_locs = []
@@ -1227,30 +1223,38 @@ def value_getitem(placement):
12271223
if inplace and blk.should_store(value):
12281224
# Updating inplace -> check if we need to do Copy-on-Write
12291225
if using_copy_on_write() and not self._has_no_reference_block(blkno_l):
1230-
1231-
# print("Hit here")
1232-
# print(f"Blk locs is {blk_locs}")
1233-
# print(f"Blkno_l is {blkno_l}")
12341226
prev_refs = self.refs[blkno_l]
1235-
leftover_blocks = blk.delete(blk_locs)
1236-
num_extra_blocks = len(leftover_blocks)
1227+
leftover_blocks = tuple(blk.delete(blk_locs))
12371228
# Preserve refs for unchanged blocks
1238-
extra_refs = [prev_refs] * num_extra_blocks
1239-
self.refs = self.refs[:blkno_l] + extra_refs + self.refs[blkno_l:]
1229+
# Add new block where old block was and remaining blocks at
1230+
# the end to avoid updating all block numbers
1231+
extra_refs = [prev_refs] * len(leftover_blocks)
1232+
self.refs = (
1233+
self.refs[:blkno_l]
1234+
+ [None]
1235+
+ self.refs[blkno_l + 1 :]
1236+
+ extra_refs
1237+
)
12401238

12411239
# TODO: Are we sure we want 2D?
1242-
nb = new_block_2d(value, placement=blk._mgr_locs)
1240+
# Also generalize this to bigger than 1-D locs
1241+
nb = new_block_2d(
1242+
value,
1243+
placement=BlockPlacement(slice(blk_locs[0], blk_locs[0] + 1)),
1244+
)
12431245
old_blocks = self.blocks
12441246
new_blocks = (
12451247
old_blocks[:blkno_l]
1246-
+ tuple(leftover_blocks[:blkno_l])
12471248
+ (nb,)
1248-
+ tuple(leftover_blocks[blkno_l:])
1249-
+ old_blocks[blkno_l + num_extra_blocks :]
1249+
+ old_blocks[blkno_l + 1 :]
1250+
+ leftover_blocks
12501251
)
1252+
self._blklocs[nb.mgr_locs.indexer] = np.arange(len(nb))
1253+
for i, nb in enumerate(leftover_blocks):
1254+
self._blklocs[nb.mgr_locs.indexer] = np.arange(len(nb))
1255+
self._blknos[nb.mgr_locs.indexer] = i + len(old_blocks)
12511256
self.blocks = new_blocks
12521257

1253-
self._rebuild_blknos_and_blklocs()
12541258
# blk.set_inplace(blk_locs, value_getitem(val_locs), copy=True)
12551259
# self._clear_reference_block(blkno_l)
12561260
else:

pandas/tests/copy_view/test_methods.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -703,22 +703,24 @@ def test_squeeze(using_copy_on_write):
703703

704704

705705
@pytest.mark.parametrize(
706-
"to_replace",
706+
"replace_kwargs",
707707
[
708-
{"a": 1, "b": 4},
708+
{"to_replace": {"a": 1, "b": 4}, "value": -1},
709709
# Test CoW splits blocks to avoid copying unchanged columns
710-
{"a": 1},
710+
{"to_replace": {"a": 1}, "value": -1},
711+
{"to_replace": {"b": 4}, "value": -1},
712+
# TODO: broken, fix by fixing Block.replace_list()
713+
# {"to_replace": {"b": 1}},
711714
# TODO: broken, fix by fixing Block.replace()
712715
# 1
713716
],
714717
)
715-
def test_replace(using_copy_on_write, to_replace):
718+
def test_replace(using_copy_on_write, replace_kwargs):
716719
df = DataFrame({"a": [1, 2, 3], "b": [4, 5, 6], "c": ["foo", "bar", "baz"]})
717720
df_orig = df.copy()
718721

719-
df_replaced = df.replace(to_replace=to_replace, value=-1)
722+
df_replaced = df.replace(**replace_kwargs)
720723

721-
# Should share memory regardless of CoW since squeeze is just an iloc
722724
if using_copy_on_write:
723725
if (df_replaced["b"] == df["b"]).all():
724726
assert np.shares_memory(get_array(df_replaced, "b"), get_array(df, "b"))

0 commit comments

Comments
 (0)