@@ -906,8 +906,7 @@ def putmask(
906
906
mask = _extract_bool_array (mask )
907
907
assert not isinstance (new , (ABCIndexClass , ABCSeries , ABCDataFrame ))
908
908
909
- new_values = self .values if inplace else self .values .copy ()
910
-
909
+ new_values = self .values # delay copy if possible.
911
910
# if we are passed a scalar None, convert it here
912
911
if not is_list_like (new ) and isna (new ) and not self .is_object :
913
912
# FIXME: make sure we have compatible NA
@@ -917,7 +916,7 @@ def putmask(
917
916
# We only get here for non-Extension Blocks, so _try_coerce_args
918
917
# is only relevant for DatetimeBlock and TimedeltaBlock
919
918
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 )
921
920
922
921
if transpose :
923
922
new_values = new_values .T
@@ -929,6 +928,8 @@ def putmask(
929
928
new = np .repeat (new , new_values .shape [- 1 ]).reshape (self .shape )
930
929
new = new .astype (new_values .dtype )
931
930
931
+ if new_values is self .values and not inplace :
932
+ new_values = new_values .copy ()
932
933
# we require exact matches between the len of the
933
934
# values we are setting (or is compat). np.putmask
934
935
# doesn't check this and will simply truncate / pad
@@ -1000,6 +1001,8 @@ def f(mask, val, idx):
1000
1001
return [self ]
1001
1002
1002
1003
if transpose :
1004
+ if new_values is None :
1005
+ new_values = self .values if inplace else self .values .copy ()
1003
1006
new_values = new_values .T
1004
1007
1005
1008
return [self .make_block (new_values )]
0 commit comments