@@ -137,7 +137,12 @@ class MultiIndex(Index):
137
137
----------
138
138
levels : sequence of arrays
139
139
The unique labels for each level
140
+ codes : sequence of arrays
141
+ Integers for each level designating which label at each location
140
142
labels : sequence of arrays
143
+ .. deprecated:: 0.24.0
144
+ Use ``codes`` instead
145
+
141
146
Integers for each level designating which label at each location
142
147
sortorder : optional int
143
148
Level of sortedness (must be lexicographically sorted by that
@@ -181,6 +186,7 @@ class MultiIndex(Index):
181
186
----------
182
187
names
183
188
levels
189
+ codes
184
190
labels
185
191
nlevels
186
192
levshape
@@ -206,7 +212,7 @@ class MultiIndex(Index):
206
212
_typ = 'multiindex'
207
213
_names = FrozenList ()
208
214
_levels = FrozenList ()
209
- _labels = FrozenList ()
215
+ _codes = FrozenList ()
210
216
_comparables = ['names' ]
211
217
rename = Index .set_names
212
218
@@ -228,7 +234,7 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
228
234
229
235
# we've already validated levels and labels, so shortcut here
230
236
result ._set_levels (levels , copy = copy , validate = False )
231
- result ._set_labels (labels , copy = copy , validate = False )
237
+ result ._set_codes (labels , copy = copy , validate = False )
232
238
233
239
if names is not None :
234
240
# handles name validation
@@ -245,39 +251,39 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
245
251
result ._reset_identity ()
246
252
return result
247
253
248
- def _verify_integrity (self , labels = None , levels = None ):
254
+ def _verify_integrity (self , codes = None , levels = None ):
249
255
"""
250
256
251
257
Parameters
252
258
----------
253
- labels : optional list
254
- Labels to check for validity. Defaults to current labels .
259
+ codes : optional list
260
+ Codes to check for validity. Defaults to current codes .
255
261
levels : optional list
256
262
Levels to check for validity. Defaults to current levels.
257
263
258
264
Raises
259
265
------
260
266
ValueError
261
- If length of levels and labels don't match, if any label would
267
+ If length of levels and codes don't match, if any code would
262
268
exceed level bounds, or there are any duplicate levels.
263
269
"""
264
270
# NOTE: Currently does not check, among other things, that cached
265
271
# nlevels matches nor that sortorder matches actually sortorder.
266
- labels = labels or self .labels
272
+ codes = codes or self .labels
267
273
levels = levels or self .levels
268
274
269
- if len (levels ) != len (labels ):
270
- raise ValueError ("Length of levels and labels must match. NOTE:"
275
+ if len (levels ) != len (codes ):
276
+ raise ValueError ("Length of levels and codes must match. NOTE:"
271
277
" this index is in an inconsistent state." )
272
- label_length = len (self .labels [0 ])
273
- for i , (level , label ) in enumerate (zip (levels , labels )):
274
- if len (label ) != label_length :
275
- raise ValueError ("Unequal label lengths: %s" %
276
- ([len (lab ) for lab in labels ]))
277
- if len (label ) and label .max () >= len (level ):
278
- raise ValueError ("On level %d, label max (%d) >= length of"
278
+ codes_length = len (self .labels [0 ])
279
+ for i , (level , level_codes ) in enumerate (zip (levels , codes )):
280
+ if len (level_codes ) != codes_length :
281
+ raise ValueError ("Unequal code lengths: %s" %
282
+ ([len (code_ ) for code_ in codes ]))
283
+ if len (level_codes ) and level_codes .max () >= len (level ):
284
+ raise ValueError ("On level %d, code max (%d) >= length of"
279
285
" level (%d). NOTE: this index is in an"
280
- " inconsistent state" % (i , label .max (),
286
+ " inconsistent state" % (i , level_codes .max (),
281
287
len (level )))
282
288
if not level .is_unique :
283
289
raise ValueError ("Level values must be unique: {values} on "
@@ -415,33 +421,33 @@ def set_levels(self, levels, level=None, inplace=False,
415
421
416
422
@property
417
423
def labels (self ):
418
- return self ._labels
424
+ return self ._codes
419
425
420
- def _set_labels (self , labels , level = None , copy = False , validate = True ,
421
- verify_integrity = False ):
426
+ def _set_codes (self , codes , level = None , copy = False , validate = True ,
427
+ verify_integrity = False ):
422
428
423
- if validate and level is None and len (labels ) != self .nlevels :
424
- raise ValueError ("Length of labels must match number of levels" )
425
- if validate and level is not None and len (labels ) != len (level ):
426
- raise ValueError ('Length of labels must match length of levels.' )
429
+ if validate and level is None and len (codes ) != self .nlevels :
430
+ raise ValueError ("Length of codes must match number of levels" )
431
+ if validate and level is not None and len (codes ) != len (level ):
432
+ raise ValueError ('Length of codes must match length of levels.' )
427
433
428
434
if level is None :
429
- new_labels = FrozenList (
430
- _ensure_frozen (lab , lev , copy = copy )._shallow_copy ()
431
- for lev , lab in zip (self .levels , labels ))
435
+ new_codes = FrozenList (
436
+ _ensure_frozen (level_codes , lev , copy = copy )._shallow_copy ()
437
+ for lev , level_codes in zip (self .levels , codes ))
432
438
else :
433
439
level = [self ._get_level_number (l ) for l in level ]
434
- new_labels = list (self ._labels )
435
- for lev_idx , lab in zip (level , labels ):
440
+ new_codes = list (self ._codes )
441
+ for lev_idx , level_codes in zip (level , codes ):
436
442
lev = self .levels [lev_idx ]
437
- new_labels [lev_idx ] = _ensure_frozen (
438
- lab , lev , copy = copy )._shallow_copy ()
439
- new_labels = FrozenList (new_labels )
443
+ new_codes [lev_idx ] = _ensure_frozen (
444
+ level_codes , lev , copy = copy )._shallow_copy ()
445
+ new_codes = FrozenList (new_codes )
440
446
441
447
if verify_integrity :
442
- self ._verify_integrity (labels = new_labels )
448
+ self ._verify_integrity (codes = new_codes )
443
449
444
- self ._labels = new_labels
450
+ self ._codes = new_codes
445
451
self ._tuples = None
446
452
self ._reset_cache ()
447
453
@@ -504,7 +510,7 @@ def set_labels(self, labels, level=None, inplace=False,
504
510
else :
505
511
idx = self ._shallow_copy ()
506
512
idx ._reset_identity ()
507
- idx ._set_labels (labels , level = level , verify_integrity = verify_integrity )
513
+ idx ._set_codes (labels , level = level , verify_integrity = verify_integrity )
508
514
if not inplace :
509
515
return idx
510
516
@@ -640,7 +646,7 @@ def _format_attrs(self):
640
646
attrs = [
641
647
('levels' , ibase .default_pprint (self ._levels ,
642
648
max_seq_items = False )),
643
- ('labels' , ibase .default_pprint (self ._labels ,
649
+ ('labels' , ibase .default_pprint (self ._codes ,
644
650
max_seq_items = False ))]
645
651
if com ._any_not_none (* self .names ):
646
652
attrs .append (('names' , ibase .default_pprint (self .names )))
@@ -1587,7 +1593,7 @@ def remove_unused_levels(self):
1587
1593
if changed :
1588
1594
result ._reset_identity ()
1589
1595
result ._set_levels (new_levels , validate = False )
1590
- result ._set_labels (new_labels , validate = False )
1596
+ result ._set_codes (new_labels , validate = False )
1591
1597
1592
1598
return result
1593
1599
@@ -1623,7 +1629,7 @@ def __setstate__(self, state):
1623
1629
levels , labels , sortorder , names = own_state
1624
1630
1625
1631
self ._set_levels ([Index (x ) for x in levels ], validate = False )
1626
- self ._set_labels (labels )
1632
+ self ._set_codes (labels )
1627
1633
self ._set_names (names )
1628
1634
self .sortorder = sortorder
1629
1635
self ._verify_integrity ()
0 commit comments