32
32
is_bool_dtype ,
33
33
is_object_dtype ,
34
34
is_datetimelike_v_numeric ,
35
+ is_datetimelike_v_object ,
35
36
is_float_dtype , is_numeric_dtype ,
36
37
is_numeric_v_string_like , is_extension_type ,
37
38
is_extension_array_dtype ,
@@ -3745,14 +3746,58 @@ def comp(s):
3745
3746
# its possible to get multiple result blocks here
3746
3747
# replace ALWAYS will return a list
3747
3748
rb = [blk if inplace else blk .copy ()]
3749
+ orig_rb = rb
3750
+ rb_map = {}
3748
3751
for i , (s , d ) in enumerate (zip (src_list , dest_list )):
3749
3752
new_rb = []
3750
- for b in rb :
3753
+ new_rb_map = {}
3754
+ for i_b , b in enumerate (rb ):
3755
+ before_len = len (new_rb )
3756
+
3751
3757
if b .dtype == np .object_ :
3752
3758
convert = i == src_len
3753
- result = b .replace (s , d , inplace = inplace , regex = regex ,
3754
- mgr = mgr , convert = convert )
3759
+
3760
+ if not regex :
3761
+ print (masks )
3762
+ filter_data = (
3763
+ np .where (masks [i ][b .mgr_locs .indexer ])[0 ]
3764
+ + b .mgr_locs .indexer .start
3765
+ )
3766
+ result = b .replace (
3767
+ s , d , inplace = inplace , regex = regex ,
3768
+ mgr = mgr , convert = convert , filter = filter_data
3769
+ )
3770
+ else :
3771
+ result = b .replace (s , d , inplace = inplace , regex = regex ,
3772
+ mgr = mgr , convert = convert )
3773
+
3755
3774
new_rb = _extend_blocks (result , new_rb )
3775
+
3776
+ if i_b in rb_map and regex :
3777
+ after_len = len (new_rb )
3778
+ for j in range (before_len , after_len ):
3779
+ new_b_values = new_rb [j ].get_values ().ravel ()
3780
+
3781
+ i_orig_b , _ , size = rb_map [i_b ]
3782
+ orig_b_values = orig_rb [i_orig_b ].get_values ()
3783
+
3784
+ diff = after_len - before_len
3785
+ i_part = j - before_len
3786
+
3787
+ if max (diff , size ) > 1 :
3788
+ # Original block is extracted.
3789
+ # Get the part which corresponds to the result.
3790
+ orig_b_values = orig_b_values [i_part ].ravel ()
3791
+ else :
3792
+ orig_b_values = orig_b_values .ravel ()
3793
+
3794
+ if diff > 1 :
3795
+ b_values = b .get_values ()[i_part ].ravel ()
3796
+ else :
3797
+ b_values = b .get_values ().ravel ()
3798
+
3799
+ cond = (orig_b_values != b_values )
3800
+ new_b_values [cond ] = b_values [cond ]
3756
3801
else :
3757
3802
# get our mask for this element, sized to this
3758
3803
# particular block
@@ -3762,6 +3807,18 @@ def comp(s):
3762
3807
new_rb .extend (b .putmask (m , d , inplace = True ))
3763
3808
else :
3764
3809
new_rb .append (b )
3810
+
3811
+ if regex :
3812
+ after_len = len (new_rb )
3813
+ for j in range (before_len , after_len ):
3814
+ diff = after_len - before_len
3815
+ if not rb_map :
3816
+ new_rb_map [j ] = (i_b , before_len , diff )
3817
+ else :
3818
+ new_rb_map [j ] = (rb_map [i_b ][0 ], before_len , diff )
3819
+
3820
+ rb_map = new_rb_map
3821
+
3765
3822
rb = new_rb
3766
3823
result_blocks .extend (rb )
3767
3824
@@ -5149,6 +5206,11 @@ def _maybe_compare(a, b, op):
5149
5206
result = False
5150
5207
5151
5208
else :
5209
+ if is_datetimelike_v_object (a , b ):
5210
+ try :
5211
+ a = a .astype (type (b ))
5212
+ except TypeError :
5213
+ pass
5152
5214
result = op (a , b )
5153
5215
5154
5216
if is_scalar (result ) and (is_a_array or is_b_array ):
0 commit comments