3
3
import operator
4
4
import re
5
5
from typing import (
6
+ Any ,
6
7
DefaultDict ,
7
8
Dict ,
8
9
List ,
@@ -600,8 +601,12 @@ def replace(self, value, **kwargs) -> "BlockManager":
600
601
return self .apply ("replace" , value = value , ** kwargs )
601
602
602
603
def replace_list (
603
- self , src_list , dest_list , inplace : bool = False , regex : bool = False
604
- ) -> "BlockManager" :
604
+ self : T ,
605
+ src_list : List [Any ],
606
+ dest_list : List [Any ],
607
+ inplace : bool = False ,
608
+ regex : bool = False ,
609
+ ) -> T :
605
610
""" do a list replace """
606
611
inplace = validate_bool_kwarg (inplace , "inplace" )
607
612
@@ -625,34 +630,14 @@ def comp(s: Scalar, mask: np.ndarray, regex: bool = False):
625
630
626
631
masks = [comp (s , mask , regex ) for s in src_list ]
627
632
628
- result_blocks = []
629
- src_len = len (src_list ) - 1
630
- for blk in self .blocks :
631
-
632
- # its possible to get multiple result blocks here
633
- # replace ALWAYS will return a list
634
- rb = [blk if inplace else blk .copy ()]
635
- for i , (s , d ) in enumerate (zip (src_list , dest_list )):
636
- new_rb : List [Block ] = []
637
- for b in rb :
638
- m = masks [i ][b .mgr_locs .indexer ]
639
- convert = i == src_len # only convert once at the end
640
- result = b ._replace_coerce (
641
- mask = m ,
642
- to_replace = s ,
643
- value = d ,
644
- inplace = inplace ,
645
- convert = convert ,
646
- regex = regex ,
647
- )
648
- if m .any () or convert :
649
- new_rb = _extend_blocks (result , new_rb )
650
- else :
651
- new_rb .append (b )
652
- rb = new_rb
653
- result_blocks .extend (rb )
654
-
655
- bm = type (self ).from_blocks (result_blocks , self .axes )
633
+ bm = self .apply (
634
+ "_replace_list" ,
635
+ src_list = src_list ,
636
+ dest_list = dest_list ,
637
+ masks = masks ,
638
+ inplace = inplace ,
639
+ regex = regex ,
640
+ )
656
641
bm ._consolidate_inplace ()
657
642
return bm
658
643
0 commit comments