@@ -1430,213 +1430,44 @@ def test_replace_bytes(self, frame_or_series):
1430
1430
1431
1431
1432
1432
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 ()
1585
1451
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 )
1595
1454
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
1604
1460
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 )
1612
1462
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
1620
1466
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 = "..."
1632
1471
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