Skip to content

Commit aa0f138

Browse files
pv8473h12WillAyd
authored andcommitted
GH 16051: DataFrame.replace() overwrites when values are non-numeric (#29359)
1 parent 11476cb commit aa0f138

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

pandas/tests/frame/test_replace.py

+27
Original file line numberDiff line numberDiff line change
@@ -1295,3 +1295,30 @@ def test_replace_method(self, to_replace, method, expected):
12951295
result = df.replace(to_replace=to_replace, value=None, method=method)
12961296
expected = DataFrame(expected)
12971297
tm.assert_frame_equal(result, expected)
1298+
1299+
@pytest.mark.parametrize(
1300+
"df, to_replace, exp",
1301+
[
1302+
(
1303+
{"col1": [1, 2, 3], "col2": [4, 5, 6]},
1304+
{4: 5, 5: 6, 6: 7},
1305+
{"col1": [1, 2, 3], "col2": [5, 6, 7]},
1306+
),
1307+
(
1308+
{"col1": [1, 2, 3], "col2": ["4", "5", "6"]},
1309+
{"4": "5", "5": "6", "6": "7"},
1310+
{"col1": [1, 2, 3], "col2": ["5", "6", "7"]},
1311+
),
1312+
],
1313+
)
1314+
def test_replace_commutative(self, df, to_replace, exp):
1315+
# GH 16051
1316+
# DataFrame.replace() overwrites when values are non-numeric
1317+
# also added to data frame whilst issue was for series
1318+
1319+
df = pd.DataFrame(df)
1320+
1321+
expected = pd.DataFrame(exp)
1322+
result = df.replace(to_replace)
1323+
1324+
tm.assert_frame_equal(result, expected)

pandas/tests/series/test_replace.py

+19
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,24 @@ def test_replace_with_no_overflowerror(self):
306306
expected = pd.Series([0, 1, "100000000000000000001"])
307307
tm.assert_series_equal(result, expected)
308308

309+
@pytest.mark.parametrize(
310+
"ser, to_replace, exp",
311+
[
312+
([1, 2, 3], {1: 2, 2: 3, 3: 4}, [2, 3, 4]),
313+
(["1", "2", "3"], {"1": "2", "2": "3", "3": "4"}, ["2", "3", "4"]),
314+
],
315+
)
316+
def test_replace_commutative(self, ser, to_replace, exp):
317+
# GH 16051
318+
# DataFrame.replace() overwrites when values are non-numeric
319+
320+
series = pd.Series(ser)
321+
322+
expected = pd.Series(exp)
323+
result = series.replace(to_replace)
324+
325+
tm.assert_series_equal(result, expected)
326+
309327
@pytest.mark.parametrize(
310328
"ser, exp", [([1, 2, 3], [1, True, 3]), (["x", 2, 3], ["x", True, 3])]
311329
)
@@ -316,4 +334,5 @@ def test_replace_no_cast(self, ser, exp):
316334
series = pd.Series(ser)
317335
result = series.replace(2, True)
318336
expected = pd.Series(exp)
337+
319338
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)