Skip to content

Commit 3e5002f

Browse files
mzeitlin11JulianWgs
authored andcommitted
TST/CLN: parameterize/dedup replace test2 (pandas-dev#41501)
1 parent 213a00d commit 3e5002f

File tree

1 file changed

+35
-204
lines changed

1 file changed

+35
-204
lines changed

pandas/tests/frame/methods/test_replace.py

+35-204
Original file line numberDiff line numberDiff line change
@@ -1430,213 +1430,44 @@ def test_replace_bytes(self, frame_or_series):
14301430

14311431

14321432
class TestDataFrameReplaceRegex:
1433-
def test_regex_replace_scalar(self, mix_ab):
1434-
obj = {"a": list("ab.."), "b": list("efgh")}
1435-
dfobj = DataFrame(obj)
1436-
dfmix = DataFrame(mix_ab)
1437-
1438-
# simplest cases
1439-
# regex -> value
1440-
# obj frame
1441-
res = dfobj.replace(r"\s*\.\s*", np.nan, regex=True)
1442-
tm.assert_frame_equal(dfobj, res.fillna("."))
1443-
1444-
# mixed
1445-
res = dfmix.replace(r"\s*\.\s*", np.nan, regex=True)
1446-
tm.assert_frame_equal(dfmix, res.fillna("."))
1447-
1448-
# regex -> regex
1449-
# obj frame
1450-
res = dfobj.replace(r"\s*(\.)\s*", r"\1\1\1", regex=True)
1451-
objc = obj.copy()
1452-
objc["a"] = ["a", "b", "...", "..."]
1453-
expec = DataFrame(objc)
1454-
tm.assert_frame_equal(res, expec)
1455-
1456-
# with mixed
1457-
res = dfmix.replace(r"\s*(\.)\s*", r"\1\1\1", regex=True)
1458-
mixc = mix_ab.copy()
1459-
mixc["b"] = ["a", "b", "...", "..."]
1460-
expec = DataFrame(mixc)
1461-
tm.assert_frame_equal(res, expec)
1462-
1463-
# everything with compiled regexs as well
1464-
res = dfobj.replace(re.compile(r"\s*\.\s*"), np.nan, regex=True)
1465-
tm.assert_frame_equal(dfobj, res.fillna("."))
1466-
1467-
# mixed
1468-
res = dfmix.replace(re.compile(r"\s*\.\s*"), np.nan, regex=True)
1469-
tm.assert_frame_equal(dfmix, res.fillna("."))
1470-
1471-
# regex -> regex
1472-
# obj frame
1473-
res = dfobj.replace(re.compile(r"\s*(\.)\s*"), r"\1\1\1")
1474-
objc = obj.copy()
1475-
objc["a"] = ["a", "b", "...", "..."]
1476-
expec = DataFrame(objc)
1477-
tm.assert_frame_equal(res, expec)
1478-
1479-
# with mixed
1480-
res = dfmix.replace(re.compile(r"\s*(\.)\s*"), r"\1\1\1")
1481-
mixc = mix_ab.copy()
1482-
mixc["b"] = ["a", "b", "...", "..."]
1483-
expec = DataFrame(mixc)
1484-
tm.assert_frame_equal(res, expec)
1485-
1486-
res = dfmix.replace(regex=re.compile(r"\s*(\.)\s*"), value=r"\1\1\1")
1487-
mixc = mix_ab.copy()
1488-
mixc["b"] = ["a", "b", "...", "..."]
1489-
expec = DataFrame(mixc)
1490-
tm.assert_frame_equal(res, expec)
1491-
1492-
res = dfmix.replace(regex=r"\s*(\.)\s*", value=r"\1\1\1")
1493-
mixc = mix_ab.copy()
1494-
mixc["b"] = ["a", "b", "...", "..."]
1495-
expec = DataFrame(mixc)
1496-
tm.assert_frame_equal(res, expec)
1497-
1498-
def test_regex_replace_scalar_inplace(self, mix_ab):
1499-
obj = {"a": list("ab.."), "b": list("efgh")}
1500-
dfobj = DataFrame(obj)
1501-
dfmix = DataFrame(mix_ab)
1502-
1503-
# simplest cases
1504-
# regex -> value
1505-
# obj frame
1506-
res = dfobj.copy()
1507-
return_value = res.replace(r"\s*\.\s*", np.nan, regex=True, inplace=True)
1508-
assert return_value is None
1509-
tm.assert_frame_equal(dfobj, res.fillna("."))
1510-
1511-
# mixed
1512-
res = dfmix.copy()
1513-
return_value = res.replace(r"\s*\.\s*", np.nan, regex=True, inplace=True)
1514-
assert return_value is None
1515-
tm.assert_frame_equal(dfmix, res.fillna("."))
1516-
1517-
# regex -> regex
1518-
# obj frame
1519-
res = dfobj.copy()
1520-
return_value = res.replace(r"\s*(\.)\s*", r"\1\1\1", regex=True, inplace=True)
1521-
assert return_value is None
1522-
objc = obj.copy()
1523-
objc["a"] = ["a", "b", "...", "..."]
1524-
expec = DataFrame(objc)
1525-
tm.assert_frame_equal(res, expec)
1526-
1527-
# with mixed
1528-
res = dfmix.copy()
1529-
return_value = res.replace(r"\s*(\.)\s*", r"\1\1\1", regex=True, inplace=True)
1530-
assert return_value is None
1531-
mixc = mix_ab.copy()
1532-
mixc["b"] = ["a", "b", "...", "..."]
1533-
expec = DataFrame(mixc)
1534-
tm.assert_frame_equal(res, expec)
1535-
1536-
# everything with compiled regexs as well
1537-
res = dfobj.copy()
1538-
return_value = res.replace(
1539-
re.compile(r"\s*\.\s*"), np.nan, regex=True, inplace=True
1540-
)
1541-
assert return_value is None
1542-
tm.assert_frame_equal(dfobj, res.fillna("."))
1543-
1544-
# mixed
1545-
res = dfmix.copy()
1546-
return_value = res.replace(
1547-
re.compile(r"\s*\.\s*"), np.nan, regex=True, inplace=True
1548-
)
1549-
assert return_value is None
1550-
tm.assert_frame_equal(dfmix, res.fillna("."))
1551-
1552-
# regex -> regex
1553-
# obj frame
1554-
res = dfobj.copy()
1555-
return_value = res.replace(
1556-
re.compile(r"\s*(\.)\s*"), r"\1\1\1", regex=True, inplace=True
1557-
)
1558-
assert return_value is None
1559-
objc = obj.copy()
1560-
objc["a"] = ["a", "b", "...", "..."]
1561-
expec = DataFrame(objc)
1562-
tm.assert_frame_equal(res, expec)
1563-
1564-
# with mixed
1565-
res = dfmix.copy()
1566-
return_value = res.replace(
1567-
re.compile(r"\s*(\.)\s*"), r"\1\1\1", regex=True, inplace=True
1568-
)
1569-
assert return_value is None
1570-
mixc = mix_ab.copy()
1571-
mixc["b"] = ["a", "b", "...", "..."]
1572-
expec = DataFrame(mixc)
1573-
tm.assert_frame_equal(res, expec)
1574-
1575-
res = dfobj.copy()
1576-
return_value = res.replace(regex=r"\s*\.\s*", value=np.nan, inplace=True)
1577-
assert return_value is None
1578-
tm.assert_frame_equal(dfobj, res.fillna("."))
1579-
1580-
# mixed
1581-
res = dfmix.copy()
1582-
return_value = res.replace(regex=r"\s*\.\s*", value=np.nan, inplace=True)
1583-
assert return_value is None
1584-
tm.assert_frame_equal(dfmix, res.fillna("."))
1433+
@pytest.mark.parametrize(
1434+
"data",
1435+
[
1436+
{"a": list("ab.."), "b": list("efgh")},
1437+
{"a": list("ab.."), "b": list(range(4))},
1438+
],
1439+
)
1440+
@pytest.mark.parametrize(
1441+
"to_replace,value", [(r"\s*\.\s*", np.nan), (r"\s*(\.)\s*", r"\1\1\1")]
1442+
)
1443+
@pytest.mark.parametrize("compile_regex", [True, False])
1444+
@pytest.mark.parametrize("regex_kwarg", [True, False])
1445+
@pytest.mark.parametrize("inplace", [True, False])
1446+
def test_regex_replace_scalar(
1447+
self, data, to_replace, value, compile_regex, regex_kwarg, inplace
1448+
):
1449+
df = DataFrame(data)
1450+
expected = df.copy()
15851451

1586-
# regex -> regex
1587-
# obj frame
1588-
res = dfobj.copy()
1589-
return_value = res.replace(regex=r"\s*(\.)\s*", value=r"\1\1\1", inplace=True)
1590-
assert return_value is None
1591-
objc = obj.copy()
1592-
objc["a"] = ["a", "b", "...", "..."]
1593-
expec = DataFrame(objc)
1594-
tm.assert_frame_equal(res, expec)
1452+
if compile_regex:
1453+
to_replace = re.compile(to_replace)
15951454

1596-
# with mixed
1597-
res = dfmix.copy()
1598-
return_value = res.replace(regex=r"\s*(\.)\s*", value=r"\1\1\1", inplace=True)
1599-
assert return_value is None
1600-
mixc = mix_ab.copy()
1601-
mixc["b"] = ["a", "b", "...", "..."]
1602-
expec = DataFrame(mixc)
1603-
tm.assert_frame_equal(res, expec)
1455+
if regex_kwarg:
1456+
regex = to_replace
1457+
to_replace = None
1458+
else:
1459+
regex = True
16041460

1605-
# everything with compiled regexs as well
1606-
res = dfobj.copy()
1607-
return_value = res.replace(
1608-
regex=re.compile(r"\s*\.\s*"), value=np.nan, inplace=True
1609-
)
1610-
assert return_value is None
1611-
tm.assert_frame_equal(dfobj, res.fillna("."))
1461+
result = df.replace(to_replace, value, inplace=inplace, regex=regex)
16121462

1613-
# mixed
1614-
res = dfmix.copy()
1615-
return_value = res.replace(
1616-
regex=re.compile(r"\s*\.\s*"), value=np.nan, inplace=True
1617-
)
1618-
assert return_value is None
1619-
tm.assert_frame_equal(dfmix, res.fillna("."))
1463+
if inplace:
1464+
assert result is None
1465+
result = df
16201466

1621-
# regex -> regex
1622-
# obj frame
1623-
res = dfobj.copy()
1624-
return_value = res.replace(
1625-
regex=re.compile(r"\s*(\.)\s*"), value=r"\1\1\1", inplace=True
1626-
)
1627-
assert return_value is None
1628-
objc = obj.copy()
1629-
objc["a"] = ["a", "b", "...", "..."]
1630-
expec = DataFrame(objc)
1631-
tm.assert_frame_equal(res, expec)
1467+
if value is np.nan:
1468+
expected_replace_val = np.nan
1469+
else:
1470+
expected_replace_val = "..."
16321471

1633-
# with mixed
1634-
res = dfmix.copy()
1635-
return_value = res.replace(
1636-
regex=re.compile(r"\s*(\.)\s*"), value=r"\1\1\1", inplace=True
1637-
)
1638-
assert return_value is None
1639-
mixc = mix_ab.copy()
1640-
mixc["b"] = ["a", "b", "...", "..."]
1641-
expec = DataFrame(mixc)
1642-
tm.assert_frame_equal(res, expec)
1472+
expected.loc[expected["a"] == ".", "a"] = expected_replace_val
1473+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)