@@ -127,7 +127,12 @@ class MultiIndex(Index):
127
127
----------
128
128
levels : sequence of arrays
129
129
The unique labels for each level
130
+ codes : sequence of arrays
131
+ Integers for each level designating which label at each location
130
132
labels : sequence of arrays
133
+ .. deprecated:: 0.24.0
134
+ Use ``codes`` instead
135
+
131
136
Integers for each level designating which label at each location
132
137
sortorder : optional int
133
138
Level of sortedness (must be lexicographically sorted by that
@@ -171,6 +176,7 @@ class MultiIndex(Index):
171
176
----------
172
177
names
173
178
levels
179
+ codes
174
180
labels
175
181
nlevels
176
182
levshape
@@ -196,7 +202,7 @@ class MultiIndex(Index):
196
202
_typ = 'multiindex'
197
203
_names = FrozenList ()
198
204
_levels = FrozenList ()
199
- _labels = FrozenList ()
205
+ _codes = FrozenList ()
200
206
_comparables = ['names' ]
201
207
rename = Index .set_names
202
208
@@ -218,7 +224,7 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
218
224
219
225
# we've already validated levels and labels, so shortcut here
220
226
result ._set_levels (levels , copy = copy , validate = False )
221
- result ._set_labels (labels , copy = copy , validate = False )
227
+ result ._set_codes (labels , copy = copy , validate = False )
222
228
223
229
if names is not None :
224
230
# handles name validation
@@ -235,39 +241,39 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
235
241
result ._reset_identity ()
236
242
return result
237
243
238
- def _verify_integrity (self , labels = None , levels = None ):
244
+ def _verify_integrity (self , codes = None , levels = None ):
239
245
"""
240
246
241
247
Parameters
242
248
----------
243
- labels : optional list
244
- Labels to check for validity. Defaults to current labels .
249
+ codes : optional list
250
+ Codes to check for validity. Defaults to current codes .
245
251
levels : optional list
246
252
Levels to check for validity. Defaults to current levels.
247
253
248
254
Raises
249
255
------
250
256
ValueError
251
- If length of levels and labels don't match, if any label would
257
+ If length of levels and codes don't match, if any code would
252
258
exceed level bounds, or there are any duplicate levels.
253
259
"""
254
260
# NOTE: Currently does not check, among other things, that cached
255
261
# nlevels matches nor that sortorder matches actually sortorder.
256
- labels = labels or self .labels
262
+ codes = codes or self .labels
257
263
levels = levels or self .levels
258
264
259
- if len (levels ) != len (labels ):
260
- raise ValueError ("Length of levels and labels must match. NOTE:"
265
+ if len (levels ) != len (codes ):
266
+ raise ValueError ("Length of levels and codes must match. NOTE:"
261
267
" this index is in an inconsistent state." )
262
- label_length = len (self .labels [0 ])
263
- for i , (level , label ) in enumerate (zip (levels , labels )):
264
- if len (label ) != label_length :
265
- raise ValueError ("Unequal label lengths: %s" %
266
- ([len (lab ) for lab in labels ]))
267
- if len (label ) and label .max () >= len (level ):
268
- raise ValueError ("On level %d, label max (%d) >= length of"
268
+ codes_length = len (self .labels [0 ])
269
+ for i , (level , level_codes ) in enumerate (zip (levels , codes )):
270
+ if len (level_codes ) != codes_length :
271
+ raise ValueError ("Unequal code lengths: %s" %
272
+ ([len (code_ ) for code_ in codes ]))
273
+ if len (level_codes ) and level_codes .max () >= len (level ):
274
+ raise ValueError ("On level %d, code max (%d) >= length of"
269
275
" level (%d). NOTE: this index is in an"
270
- " inconsistent state" % (i , label .max (),
276
+ " inconsistent state" % (i , level_codes .max (),
271
277
len (level )))
272
278
if not level .is_unique :
273
279
raise ValueError ("Level values must be unique: {values} on "
@@ -404,33 +410,33 @@ def set_levels(self, levels, level=None, inplace=False,
404
410
405
411
@property
406
412
def labels (self ):
407
- return self ._labels
413
+ return self ._codes
408
414
409
- def _set_labels (self , labels , level = None , copy = False , validate = True ,
410
- verify_integrity = False ):
415
+ def _set_codes (self , codes , level = None , copy = False , validate = True ,
416
+ verify_integrity = False ):
411
417
412
- if validate and level is None and len (labels ) != self .nlevels :
413
- raise ValueError ("Length of labels must match number of levels" )
414
- if validate and level is not None and len (labels ) != len (level ):
415
- raise ValueError ('Length of labels must match length of levels.' )
418
+ if validate and level is None and len (codes ) != self .nlevels :
419
+ raise ValueError ("Length of codes must match number of levels" )
420
+ if validate and level is not None and len (codes ) != len (level ):
421
+ raise ValueError ('Length of codes must match length of levels.' )
416
422
417
423
if level is None :
418
- new_labels = FrozenList (
419
- _ensure_frozen (lab , lev , copy = copy )._shallow_copy ()
420
- for lev , lab in zip (self .levels , labels ))
424
+ new_codes = FrozenList (
425
+ _ensure_frozen (level_codes , lev , copy = copy )._shallow_copy ()
426
+ for lev , level_codes in zip (self .levels , codes ))
421
427
else :
422
428
level = [self ._get_level_number (l ) for l in level ]
423
- new_labels = list (self ._labels )
424
- for lev_idx , lab in zip (level , labels ):
429
+ new_codes = list (self ._codes )
430
+ for lev_idx , level_codes in zip (level , codes ):
425
431
lev = self .levels [lev_idx ]
426
- new_labels [lev_idx ] = _ensure_frozen (
427
- lab , lev , copy = copy )._shallow_copy ()
428
- new_labels = FrozenList (new_labels )
432
+ new_codes [lev_idx ] = _ensure_frozen (
433
+ level_codes , lev , copy = copy )._shallow_copy ()
434
+ new_codes = FrozenList (new_codes )
429
435
430
436
if verify_integrity :
431
- self ._verify_integrity (labels = new_labels )
437
+ self ._verify_integrity (codes = new_codes )
432
438
433
- self ._labels = new_labels
439
+ self ._codes = new_codes
434
440
self ._tuples = None
435
441
self ._reset_cache ()
436
442
@@ -493,7 +499,7 @@ def set_labels(self, labels, level=None, inplace=False,
493
499
else :
494
500
idx = self ._shallow_copy ()
495
501
idx ._reset_identity ()
496
- idx ._set_labels (labels , level = level , verify_integrity = verify_integrity )
502
+ idx ._set_codes (labels , level = level , verify_integrity = verify_integrity )
497
503
if not inplace :
498
504
return idx
499
505
@@ -629,7 +635,7 @@ def _format_attrs(self):
629
635
attrs = [
630
636
('levels' , ibase .default_pprint (self ._levels ,
631
637
max_seq_items = False )),
632
- ('labels' , ibase .default_pprint (self ._labels ,
638
+ ('labels' , ibase .default_pprint (self ._codes ,
633
639
max_seq_items = False ))]
634
640
if com ._any_not_none (* self .names ):
635
641
attrs .append (('names' , ibase .default_pprint (self .names )))
@@ -1574,7 +1580,7 @@ def remove_unused_levels(self):
1574
1580
if changed :
1575
1581
result ._reset_identity ()
1576
1582
result ._set_levels (new_levels , validate = False )
1577
- result ._set_labels (new_labels , validate = False )
1583
+ result ._set_codes (new_labels , validate = False )
1578
1584
1579
1585
return result
1580
1586
@@ -1610,7 +1616,7 @@ def __setstate__(self, state):
1610
1616
levels , labels , sortorder , names = own_state
1611
1617
1612
1618
self ._set_levels ([Index (x ) for x in levels ], validate = False )
1613
- self ._set_labels (labels )
1619
+ self ._set_codes (labels )
1614
1620
self ._set_names (names )
1615
1621
self .sortorder = sortorder
1616
1622
self ._verify_integrity ()
0 commit comments