Skip to content

Commit d0a687c

Browse files
authored
BUG: RecursionError when attempting to replace np.nan values (#45725) (#45749)
1 parent aafd4c8 commit d0a687c

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

pandas/core/internals/blocks.py

+1
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,7 @@ def replace(
668668
# go through replace_list
669669

670670
values = self.values
671+
value = self._standardize_fill_value(value) # GH#45725
671672

672673
if isinstance(values, Categorical):
673674
# TODO: avoid special-casing

pandas/tests/frame/methods/test_replace.py

+15
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,21 @@ def test_replace_simple_nested_dict_with_nonexistent_value(self):
661661
result = df.replace({"col": {-1: "-", 1: "a", 4: "b"}})
662662
tm.assert_frame_equal(expected, result)
663663

664+
def test_replace_numpy_nan(self, nulls_fixture):
665+
# GH#45725 ensure numpy.nan can be replaced with all other null types
666+
to_replace = np.nan
667+
value = nulls_fixture
668+
dtype = object
669+
df = DataFrame({"A": [to_replace]}, dtype=dtype)
670+
expected = DataFrame({"A": [value]}, dtype=dtype)
671+
672+
result = df.replace({to_replace: value}).astype(dtype=dtype)
673+
tm.assert_frame_equal(result, expected)
674+
675+
# same thing but different calling convention
676+
result = df.replace(to_replace, value).astype(dtype=dtype)
677+
tm.assert_frame_equal(result, expected)
678+
664679
def test_replace_value_is_none(self, datetime_frame):
665680
orig_value = datetime_frame.iloc[0, 0]
666681
orig2 = datetime_frame.iloc[1, 0]

pandas/tests/series/methods/test_replace.py

+17
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,23 @@ def test_replace_explicit_none(self):
3636
assert expected.iloc[-1] is None
3737
tm.assert_series_equal(result, expected)
3838

39+
def test_replace_numpy_nan(self, nulls_fixture):
40+
# GH#45725 ensure numpy.nan can be replaced with all other null types
41+
to_replace = np.nan
42+
value = nulls_fixture
43+
dtype = object
44+
ser = pd.Series([to_replace], dtype=dtype)
45+
expected = pd.Series([value], dtype=dtype)
46+
47+
result = ser.replace({to_replace: value}).astype(dtype=dtype)
48+
tm.assert_series_equal(result, expected)
49+
assert result.dtype == dtype
50+
51+
# same thing but different calling convention
52+
result = ser.replace(to_replace, value).astype(dtype=dtype)
53+
tm.assert_series_equal(result, expected)
54+
assert result.dtype == dtype
55+
3956
def test_replace_noop_doesnt_downcast(self):
4057
# GH#44498
4158
ser = pd.Series([None, None, pd.Timestamp("2021-12-16 17:31")], dtype=object)

0 commit comments

Comments
 (0)