From 50f9d075fc90d33b6c0dc76ad22e1439727f4948 Mon Sep 17 00:00:00 2001 From: pv8493013j Date: Sat, 2 Nov 2019 15:32:30 +0000 Subject: [PATCH 1/5] Add test GH 16051 --- pandas/tests/series/test_replace.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pandas/tests/series/test_replace.py b/pandas/tests/series/test_replace.py index e9d5a4b105a35..ef508bac7ccf9 100644 --- a/pandas/tests/series/test_replace.py +++ b/pandas/tests/series/test_replace.py @@ -305,3 +305,21 @@ def test_replace_with_no_overflowerror(self): result = s.replace(["100000000000000000000"], [1]) expected = pd.Series([0, 1, "100000000000000000001"]) tm.assert_series_equal(result, expected) + + @pytest.mark.parametrize( + "s, replacements, expected", + [ + (pd.Series([1, 2, 3]), {1: 2, 2: 3, 3: 4}, pd.Series([2, 3, 4])), + ( + pd.Series(["1", "2", "3"]), + {"1": "2", "2": "3", "3": "4"}, + pd.Series(["2", "3", "4"]), + ), + ], + ) + def test_replace_commutative(self, s, replacements, expected): + # GH 16051 + # DataFrame.replace() overwrites when values are non-numeric + + result = s.replace(replacements) + tm.assert_series_equal(result, expected) From f50b366beb586c40918ac98f46d41ecb3f6e6f39 Mon Sep 17 00:00:00 2001 From: pv8493013j Date: Sat, 2 Nov 2019 18:33:08 +0000 Subject: [PATCH 2/5] tidied tests --- pandas/tests/series/test_replace.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pandas/tests/series/test_replace.py b/pandas/tests/series/test_replace.py index ef508bac7ccf9..fa44bf08d1eff 100644 --- a/pandas/tests/series/test_replace.py +++ b/pandas/tests/series/test_replace.py @@ -307,19 +307,18 @@ def test_replace_with_no_overflowerror(self): tm.assert_series_equal(result, expected) @pytest.mark.parametrize( - "s, replacements, expected", + "ser, to_replace, exp", [ - (pd.Series([1, 2, 3]), {1: 2, 2: 3, 3: 4}, pd.Series([2, 3, 4])), - ( - pd.Series(["1", "2", "3"]), - {"1": "2", "2": "3", "3": "4"}, - pd.Series(["2", "3", "4"]), - ), + ([1, 2, 3], {1: 2, 2: 3, 3: 4}, [2, 3, 4]), + (["1", "2", "3"], {"1": "2", "2": "3", "3": "4"}, ["2", "3", "4"]), ], ) - def test_replace_commutative(self, s, replacements, expected): + def test_replace_commutative(self, ser, to_replace, exp): # GH 16051 # DataFrame.replace() overwrites when values are non-numeric - result = s.replace(replacements) + series = pd.Series(ser) + expected = pd.Series(exp) + + result = series.replace(to_replace) tm.assert_series_equal(result, expected) From 521227de2c7a533a3aa9113990abf421e573d9b1 Mon Sep 17 00:00:00 2001 From: pv8493013j Date: Sat, 2 Nov 2019 18:33:52 +0000 Subject: [PATCH 3/5] tidied tests --- pandas/tests/series/test_replace.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/tests/series/test_replace.py b/pandas/tests/series/test_replace.py index fa44bf08d1eff..9c3af61649597 100644 --- a/pandas/tests/series/test_replace.py +++ b/pandas/tests/series/test_replace.py @@ -318,7 +318,8 @@ def test_replace_commutative(self, ser, to_replace, exp): # DataFrame.replace() overwrites when values are non-numeric series = pd.Series(ser) - expected = pd.Series(exp) + expected = pd.Series(exp) result = series.replace(to_replace) + tm.assert_series_equal(result, expected) From 8f0142c21f789f10d848ad770e7f376c2a762ad8 Mon Sep 17 00:00:00 2001 From: pv8493013j Date: Sat, 2 Nov 2019 19:35:31 +0000 Subject: [PATCH 4/5] updated due to comments --- pandas/tests/frame/test_replace.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pandas/tests/frame/test_replace.py b/pandas/tests/frame/test_replace.py index 5eb2416d0dcd7..c30efa121262f 100644 --- a/pandas/tests/frame/test_replace.py +++ b/pandas/tests/frame/test_replace.py @@ -1295,3 +1295,30 @@ def test_replace_method(self, to_replace, method, expected): result = df.replace(to_replace=to_replace, value=None, method=method) expected = DataFrame(expected) tm.assert_frame_equal(result, expected) + + @pytest.mark.parametrize( + "df, to_replace, exp", + [ + ( + {"col1": [1, 2, 3], "col2": [4, 5, 6]}, + {4: 5, 5: 6, 6: 7}, + {"col1": [1, 2, 3], "col2": [5, 6, 7]}, + ), + ( + {"col1": [1, 2, 3], "col2": ["4", "5", "6"]}, + {"4": "5", "5": "6", "6": "7"}, + {"col1": [1, 2, 3], "col2": ["5", "6", "7"]}, + ), + ], + ) + def test_replace_commutative(self, df, to_replace, exp): + # GH 16051 + # DataFrame.replace() overwrites when values are non-numeric + # also added to data frame whilst issue was for series + + df = pd.DataFrame(df) + + expected = pd.DataFrame(exp) + result = df.replace(to_replace) + + tm.assert_frame_equal(result, expected) From c9f812d97a422102ba0c52a81134ca71f60d4c51 Mon Sep 17 00:00:00 2001 From: pv8493013j Date: Sun, 3 Nov 2019 22:52:28 +0000 Subject: [PATCH 5/5] resolve conflicts --- pandas/tests/series/test_replace.py | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/pandas/tests/series/test_replace.py b/pandas/tests/series/test_replace.py index 9c3af61649597..eae5af19ca807 100644 --- a/pandas/tests/series/test_replace.py +++ b/pandas/tests/series/test_replace.py @@ -323,3 +323,34 @@ def test_replace_commutative(self, ser, to_replace, exp): result = series.replace(to_replace) tm.assert_series_equal(result, expected) + + @pytest.mark.parametrize( + "ser, to_replace, exp", + [ + ([1, 2, 3], {1: 2, 2: 3, 3: 4}, [2, 3, 4]), + (["1", "2", "3"], {"1": "2", "2": "3", "3": "4"}, ["2", "3", "4"]), + ], + ) + def test_replace_commutative(self, ser, to_replace, exp): + # GH 16051 + # DataFrame.replace() overwrites when values are non-numeric + + series = pd.Series(ser) + + expected = pd.Series(exp) + result = series.replace(to_replace) + + tm.assert_series_equal(result, expected) + + @pytest.mark.parametrize( + "ser, exp", [([1, 2, 3], [1, True, 3]), (["x", 2, 3], ["x", True, 3])] + ) + def test_replace_no_cast(self, ser, exp): + # GH 9113 + # BUG: replace int64 dtype with bool coerces to int64 + + series = pd.Series(ser) + result = series.replace(2, True) + expected = pd.Series(exp) + + tm.assert_series_equal(result, expected)