@@ -379,14 +379,21 @@ def _validate_codes(self, level: list, code: list):
379
379
code = np .where (null_mask [code ], - 1 , code ) # type: ignore[assignment]
380
380
return code
381
381
382
- def _verify_integrity (self , codes : list | None = None , levels : list | None = None ):
382
+ def _verify_integrity (
383
+ self ,
384
+ codes : list | None = None ,
385
+ levels : list | None = None ,
386
+ levels_to_verify : list [int ] | range | None = None ,
387
+ ):
383
388
"""
384
389
Parameters
385
390
----------
386
391
codes : optional list
387
392
Codes to check for validity. Defaults to current codes.
388
393
levels : optional list
389
394
Levels to check for validity. Defaults to current levels.
395
+ levels_to_validate: optional list
396
+ Specifies the levels to verify.
390
397
391
398
Raises
392
399
------
@@ -403,14 +410,19 @@ def _verify_integrity(self, codes: list | None = None, levels: list | None = Non
403
410
# nlevels matches nor that sortorder matches actually sortorder.
404
411
codes = codes or self .codes
405
412
levels = levels or self .levels
413
+ if levels_to_verify is None :
414
+ levels_to_verify = range (len (levels ))
406
415
407
416
if len (levels ) != len (codes ):
408
417
raise ValueError (
409
418
"Length of levels and codes must match. NOTE: "
410
419
"this index is in an inconsistent state."
411
420
)
412
421
codes_length = len (codes [0 ])
413
- for i , (level , level_codes ) in enumerate (zip (levels , codes )):
422
+ for i in levels_to_verify :
423
+ level = levels [i ]
424
+ level_codes = codes [i ]
425
+
414
426
if len (level_codes ) != codes_length :
415
427
raise ValueError (
416
428
f"Unequal code lengths: { [len (code_ ) for code_ in codes ]} "
@@ -435,10 +447,14 @@ def _verify_integrity(self, codes: list | None = None, levels: list | None = Non
435
447
f"with lexsort_depth { _lexsort_depth (self .codes , self .nlevels )} "
436
448
)
437
449
438
- codes = [
439
- self ._validate_codes (level , code ) for level , code in zip (levels , codes )
440
- ]
441
- new_codes = FrozenList (codes )
450
+ result_codes = []
451
+ for i in range (len (levels )):
452
+ if i in levels_to_verify :
453
+ result_codes .append (self ._validate_codes (levels [i ], codes [i ]))
454
+ else :
455
+ result_codes .append (codes [i ])
456
+
457
+ new_codes = FrozenList (result_codes )
442
458
return new_codes
443
459
444
460
@classmethod
@@ -824,6 +840,7 @@ def _set_levels(
824
840
new_levels = FrozenList (
825
841
ensure_index (lev , copy = copy )._view () for lev in levels
826
842
)
843
+ level_numbers = list (range (len (new_levels )))
827
844
else :
828
845
level_numbers = [self ._get_level_number (lev ) for lev in level ]
829
846
new_levels_list = list (self ._levels )
@@ -832,7 +849,9 @@ def _set_levels(
832
849
new_levels = FrozenList (new_levels_list )
833
850
834
851
if verify_integrity :
835
- new_codes = self ._verify_integrity (levels = new_levels )
852
+ new_codes = self ._verify_integrity (
853
+ levels = new_levels , levels_to_verify = level_numbers
854
+ )
836
855
self ._codes = new_codes
837
856
838
857
names = self .names
@@ -990,11 +1009,13 @@ def _set_codes(
990
1009
if level is not None and len (codes ) != len (level ):
991
1010
raise ValueError ("Length of codes must match length of levels." )
992
1011
1012
+ level_numbers : list [int ] | range
993
1013
if level is None :
994
1014
new_codes = FrozenList (
995
1015
_coerce_indexer_frozen (level_codes , lev , copy = copy ).view ()
996
1016
for lev , level_codes in zip (self ._levels , codes )
997
1017
)
1018
+ level_numbers = range (len (new_codes ))
998
1019
else :
999
1020
level_numbers = [self ._get_level_number (lev ) for lev in level ]
1000
1021
new_codes_list = list (self ._codes )
@@ -1006,7 +1027,9 @@ def _set_codes(
1006
1027
new_codes = FrozenList (new_codes_list )
1007
1028
1008
1029
if verify_integrity :
1009
- new_codes = self ._verify_integrity (codes = new_codes )
1030
+ new_codes = self ._verify_integrity (
1031
+ codes = new_codes , levels_to_verify = level_numbers
1032
+ )
1010
1033
1011
1034
self ._codes = new_codes
1012
1035
0 commit comments