Skip to content

Commit 74a77b3

Browse files
PERF: avoid copy in replace (#34737)
1 parent dec5290 commit 74a77b3

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

pandas/core/internals/blocks.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -906,8 +906,7 @@ def putmask(
906906
mask = _extract_bool_array(mask)
907907
assert not isinstance(new, (ABCIndexClass, ABCSeries, ABCDataFrame))
908908

909-
new_values = self.values if inplace else self.values.copy()
910-
909+
new_values = self.values # delay copy if possible.
911910
# if we are passed a scalar None, convert it here
912911
if not is_list_like(new) and isna(new) and not self.is_object:
913912
# FIXME: make sure we have compatible NA
@@ -917,7 +916,7 @@ def putmask(
917916
# We only get here for non-Extension Blocks, so _try_coerce_args
918917
# is only relevant for DatetimeBlock and TimedeltaBlock
919918
if lib.is_scalar(new):
920-
new = convert_scalar_for_putitemlike(new, new_values.dtype)
919+
new = convert_scalar_for_putitemlike(new, self.values.dtype)
921920

922921
if transpose:
923922
new_values = new_values.T
@@ -929,6 +928,8 @@ def putmask(
929928
new = np.repeat(new, new_values.shape[-1]).reshape(self.shape)
930929
new = new.astype(new_values.dtype)
931930

931+
if new_values is self.values and not inplace:
932+
new_values = new_values.copy()
932933
# we require exact matches between the len of the
933934
# values we are setting (or is compat). np.putmask
934935
# doesn't check this and will simply truncate / pad
@@ -1000,6 +1001,8 @@ def f(mask, val, idx):
10001001
return [self]
10011002

10021003
if transpose:
1004+
if new_values is None:
1005+
new_values = self.values if inplace else self.values.copy()
10031006
new_values = new_values.T
10041007

10051008
return [self.make_block(new_values)]

0 commit comments

Comments
 (0)