Skip to content

Commit a1d141b

Browse files
committed
foo
1 parent ef019fa commit a1d141b

File tree

1 file changed

+65
-3
lines changed

1 file changed

+65
-3
lines changed

pandas/core/internals.py

+65-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
is_bool_dtype,
3333
is_object_dtype,
3434
is_datetimelike_v_numeric,
35+
is_datetimelike_v_object,
3536
is_float_dtype, is_numeric_dtype,
3637
is_numeric_v_string_like, is_extension_type,
3738
is_extension_array_dtype,
@@ -3745,14 +3746,58 @@ def comp(s):
37453746
# its possible to get multiple result blocks here
37463747
# replace ALWAYS will return a list
37473748
rb = [blk if inplace else blk.copy()]
3749+
orig_rb = rb
3750+
rb_map = {}
37483751
for i, (s, d) in enumerate(zip(src_list, dest_list)):
37493752
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+
37513757
if b.dtype == np.object_:
37523758
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+
37553774
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]
37563801
else:
37573802
# get our mask for this element, sized to this
37583803
# particular block
@@ -3762,6 +3807,18 @@ def comp(s):
37623807
new_rb.extend(b.putmask(m, d, inplace=True))
37633808
else:
37643809
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+
37653822
rb = new_rb
37663823
result_blocks.extend(rb)
37673824

@@ -5149,6 +5206,11 @@ def _maybe_compare(a, b, op):
51495206
result = False
51505207

51515208
else:
5209+
if is_datetimelike_v_object(a, b):
5210+
try:
5211+
a = a.astype(type(b))
5212+
except TypeError:
5213+
pass
51525214
result = op(a, b)
51535215

51545216
if is_scalar(result) and (is_a_array or is_b_array):

0 commit comments

Comments
 (0)