Skip to content

BUG: RecursionError when attempting to replace np.nan values (#45725) #45749

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Feb 3, 2022
Merged
1 change: 1 addition & 0 deletions pandas/core/internals/blocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,7 @@ def replace(
# go through replace_list

values = self.values
value = self._standardize_fill_value(value) # GH#45725

if isinstance(values, Categorical):
# TODO: avoid special-casing
Expand Down
15 changes: 15 additions & 0 deletions pandas/tests/frame/methods/test_replace.py
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,21 @@ def test_replace_simple_nested_dict_with_nonexistent_value(self):
result = df.replace({"col": {-1: "-", 1: "a", 4: "b"}})
tm.assert_frame_equal(expected, result)

def test_replace_numpy_nan(self, nulls_fixture):
# GH#45725 ensure numpy.nan can be replaced with all other null types
to_replace = np.nan
value = nulls_fixture
dtype = object
df = DataFrame({"A": [to_replace]}, dtype=dtype)
expected = DataFrame({"A": [value]}, dtype=dtype)

result = df.replace({to_replace: value}).astype(dtype=dtype)
tm.assert_frame_equal(result, expected)

# same thing but different calling convention
result = df.replace(to_replace, value).astype(dtype=dtype)
tm.assert_frame_equal(result, expected)

def test_replace_value_is_none(self, datetime_frame):
orig_value = datetime_frame.iloc[0, 0]
orig2 = datetime_frame.iloc[1, 0]
Expand Down
17 changes: 17 additions & 0 deletions pandas/tests/series/methods/test_replace.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,23 @@ def test_replace_explicit_none(self):
assert expected.iloc[-1] is None
tm.assert_series_equal(result, expected)

def test_replace_numpy_nan(self, nulls_fixture):
# GH#45725 ensure numpy.nan can be replaced with all other null types
to_replace = np.nan
value = nulls_fixture
dtype = object
ser = pd.Series([to_replace], dtype=dtype)
expected = pd.Series([value], dtype=dtype)

result = ser.replace({to_replace: value}).astype(dtype=dtype)
tm.assert_series_equal(result, expected)
assert result.dtype == dtype

# same thing but different calling convention
result = ser.replace(to_replace, value).astype(dtype=dtype)
tm.assert_series_equal(result, expected)
assert result.dtype == dtype

def test_replace_noop_doesnt_downcast(self):
# GH#44498
ser = pd.Series([None, None, pd.Timestamp("2021-12-16 17:31")], dtype=object)
Expand Down