@@ -1430,213 +1430,44 @@ def test_replace_bytes(self, frame_or_series):
14301430
14311431
14321432class 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