Skip to content

Commit b1a2f48

Browse files
BUG: inconsistency in dtype of replace() (#44897)
1 parent b1827ea commit b1a2f48

File tree

4 files changed

+23
-2
lines changed

4 files changed

+23
-2
lines changed

doc/source/whatsnew/v1.4.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ Reshaping
831831
- Bug in :meth:`DataFrame.stack` with ``ExtensionDtype`` columns incorrectly raising (:issue:`43561`)
832832
- Bug in :meth:`Series.unstack` with object doing unwanted type inference on resulting columns (:issue:`44595`)
833833
- Bug in :class:`MultiIndex` failing join operations with overlapping ``IntervalIndex`` levels (:issue:`44096`)
834-
-
834+
- Bug in :meth:`DataFrame.replace` and :meth:`Series.replace` results is different ``dtype`` based on ``regex`` parameter (:issue:`44864`)
835835

836836
Sparse
837837
^^^^^^

pandas/core/internals/blocks.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,7 @@ def _replace_regex(
737737
replace_regex(new_values, rx, value, mask)
738738

739739
block = self.make_block(new_values)
740-
return [block]
740+
return block.convert(numeric=False, copy=False)
741741

742742
@final
743743
def replace_list(

pandas/tests/frame/methods/test_replace.py

+13
Original file line numberDiff line numberDiff line change
@@ -1508,3 +1508,16 @@ def test_regex_replace_scalar(
15081508

15091509
expected.loc[expected["a"] == ".", "a"] = expected_replace_val
15101510
tm.assert_frame_equal(result, expected)
1511+
1512+
@pytest.mark.parametrize("regex", [False, True])
1513+
def test_replace_regex_dtype_frame(self, regex):
1514+
# GH-48644
1515+
df1 = DataFrame({"A": ["0"], "B": ["0"]})
1516+
expected_df1 = DataFrame({"A": [1], "B": [1]})
1517+
result_df1 = df1.replace(to_replace="0", value=1, regex=regex)
1518+
tm.assert_frame_equal(result_df1, expected_df1)
1519+
1520+
df2 = DataFrame({"A": ["0"], "B": ["1"]})
1521+
expected_df2 = DataFrame({"A": [1], "B": ["1"]})
1522+
result_df2 = df2.replace(to_replace="0", value=1, regex=regex)
1523+
tm.assert_frame_equal(result_df2, expected_df2)

pandas/tests/series/methods/test_replace.py

+8
Original file line numberDiff line numberDiff line change
@@ -604,3 +604,11 @@ def test_replace_nullable_numeric(self):
604604
assert ints.replace({1: 9.0}).dtype == ints.dtype
605605
assert ints.replace(1, 9.0).dtype == ints.dtype
606606
# FIXME: ints.replace({1: 9.5}) raises bc of incorrect _can_hold_element
607+
608+
@pytest.mark.parametrize("regex", [False, True])
609+
def test_replace_regex_dtype_series(self, regex):
610+
# GH-48644
611+
series = pd.Series(["0"])
612+
expected = pd.Series([1])
613+
result = series.replace(to_replace="0", value=1, regex=regex)
614+
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)