@@ -126,7 +126,12 @@ class MultiIndex(Index):
126
126
----------
127
127
levels : sequence of arrays
128
128
The unique labels for each level
129
+ codes : sequence of arrays
130
+ Integers for each level designating which label at each location
129
131
labels : sequence of arrays
132
+ .. deprecated:: 0.24.0
133
+ Use ``codes`` instead
134
+
130
135
Integers for each level designating which label at each location
131
136
sortorder : optional int
132
137
Level of sortedness (must be lexicographically sorted by that
@@ -170,6 +175,7 @@ class MultiIndex(Index):
170
175
----------
171
176
names
172
177
levels
178
+ codes
173
179
labels
174
180
nlevels
175
181
levshape
@@ -195,7 +201,7 @@ class MultiIndex(Index):
195
201
_typ = 'multiindex'
196
202
_names = FrozenList ()
197
203
_levels = FrozenList ()
198
- _labels = FrozenList ()
204
+ _codes = FrozenList ()
199
205
_comparables = ['names' ]
200
206
rename = Index .set_names
201
207
@@ -220,7 +226,7 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
220
226
221
227
# we've already validated levels and labels, so shortcut here
222
228
result ._set_levels (levels , copy = copy , validate = False )
223
- result ._set_labels (labels , copy = copy , validate = False )
229
+ result ._set_codes (labels , copy = copy , validate = False )
224
230
225
231
if names is not None :
226
232
# handles name validation
@@ -237,39 +243,39 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
237
243
result ._reset_identity ()
238
244
return result
239
245
240
- def _verify_integrity (self , labels = None , levels = None ):
246
+ def _verify_integrity (self , codes = None , levels = None ):
241
247
"""
242
248
243
249
Parameters
244
250
----------
245
- labels : optional list
246
- Labels to check for validity. Defaults to current labels .
251
+ codes : optional list
252
+ Codes to check for validity. Defaults to current codes .
247
253
levels : optional list
248
254
Levels to check for validity. Defaults to current levels.
249
255
250
256
Raises
251
257
------
252
258
ValueError
253
- If length of levels and labels don't match, if any label would
259
+ If length of levels and codes don't match, if any code would
254
260
exceed level bounds, or there are any duplicate levels.
255
261
"""
256
262
# NOTE: Currently does not check, among other things, that cached
257
263
# nlevels matches nor that sortorder matches actually sortorder.
258
- labels = labels or self .labels
264
+ codes = codes or self .labels
259
265
levels = levels or self .levels
260
266
261
- if len (levels ) != len (labels ):
262
- raise ValueError ("Length of levels and labels must match. NOTE:"
267
+ if len (levels ) != len (codes ):
268
+ raise ValueError ("Length of levels and codes must match. NOTE:"
263
269
" this index is in an inconsistent state." )
264
- label_length = len (self .labels [0 ])
265
- for i , (level , label ) in enumerate (zip (levels , labels )):
266
- if len (label ) != label_length :
267
- raise ValueError ("Unequal label lengths: %s" %
268
- ([len (lab ) for lab in labels ]))
269
- if len (label ) and label .max () >= len (level ):
270
- raise ValueError ("On level %d, label max (%d) >= length of"
270
+ codes_length = len (self .labels [0 ])
271
+ for i , (level , level_codes ) in enumerate (zip (levels , codes )):
272
+ if len (level_codes ) != codes_length :
273
+ raise ValueError ("Unequal code lengths: %s" %
274
+ ([len (code_ ) for code_ in codes ]))
275
+ if len (level_codes ) and level_codes .max () >= len (level ):
276
+ raise ValueError ("On level %d, code max (%d) >= length of"
271
277
" level (%d). NOTE: this index is in an"
272
- " inconsistent state" % (i , label .max (),
278
+ " inconsistent state" % (i , level_codes .max (),
273
279
len (level )))
274
280
if not level .is_unique :
275
281
raise ValueError ("Level values must be unique: {values} on "
@@ -573,33 +579,33 @@ def set_levels(self, levels, level=None, inplace=False,
573
579
574
580
@property
575
581
def labels (self ):
576
- return self ._labels
582
+ return self ._codes
577
583
578
- def _set_labels (self , labels , level = None , copy = False , validate = True ,
579
- verify_integrity = False ):
584
+ def _set_codes (self , codes , level = None , copy = False , validate = True ,
585
+ verify_integrity = False ):
580
586
581
- if validate and level is None and len (labels ) != self .nlevels :
582
- raise ValueError ("Length of labels must match number of levels" )
583
- if validate and level is not None and len (labels ) != len (level ):
584
- raise ValueError ('Length of labels must match length of levels.' )
587
+ if validate and level is None and len (codes ) != self .nlevels :
588
+ raise ValueError ("Length of codes must match number of levels" )
589
+ if validate and level is not None and len (codes ) != len (level ):
590
+ raise ValueError ('Length of codes must match length of levels.' )
585
591
586
592
if level is None :
587
- new_labels = FrozenList (
588
- _ensure_frozen (lab , lev , copy = copy )._shallow_copy ()
589
- for lev , lab in zip (self .levels , labels ))
593
+ new_codes = FrozenList (
594
+ _ensure_frozen (level_codes , lev , copy = copy )._shallow_copy ()
595
+ for lev , level_codes in zip (self .levels , codes ))
590
596
else :
591
597
level = [self ._get_level_number (l ) for l in level ]
592
- new_labels = list (self ._labels )
593
- for lev_idx , lab in zip (level , labels ):
598
+ new_codes = list (self ._codes )
599
+ for lev_idx , level_codes in zip (level , codes ):
594
600
lev = self .levels [lev_idx ]
595
- new_labels [lev_idx ] = _ensure_frozen (
596
- lab , lev , copy = copy )._shallow_copy ()
597
- new_labels = FrozenList (new_labels )
601
+ new_codes [lev_idx ] = _ensure_frozen (
602
+ level_codes , lev , copy = copy )._shallow_copy ()
603
+ new_codes = FrozenList (new_codes )
598
604
599
605
if verify_integrity :
600
- self ._verify_integrity (labels = new_labels )
606
+ self ._verify_integrity (codes = new_codes )
601
607
602
- self ._labels = new_labels
608
+ self ._codes = new_codes
603
609
self ._tuples = None
604
610
self ._reset_cache ()
605
611
@@ -662,7 +668,7 @@ def set_labels(self, labels, level=None, inplace=False,
662
668
else :
663
669
idx = self ._shallow_copy ()
664
670
idx ._reset_identity ()
665
- idx ._set_labels (labels , level = level , verify_integrity = verify_integrity )
671
+ idx ._set_codes (labels , level = level , verify_integrity = verify_integrity )
666
672
if not inplace :
667
673
return idx
668
674
@@ -801,7 +807,7 @@ def _format_attrs(self):
801
807
attrs = [
802
808
('levels' , ibase .default_pprint (self ._levels ,
803
809
max_seq_items = False )),
804
- ('labels' , ibase .default_pprint (self ._labels ,
810
+ ('labels' , ibase .default_pprint (self ._codes ,
805
811
max_seq_items = False ))]
806
812
if com ._any_not_none (* self .names ):
807
813
attrs .append (('names' , ibase .default_pprint (self .names )))
@@ -1602,7 +1608,7 @@ def remove_unused_levels(self):
1602
1608
if changed :
1603
1609
result ._reset_identity ()
1604
1610
result ._set_levels (new_levels , validate = False )
1605
- result ._set_labels (new_labels , validate = False )
1611
+ result ._set_codes (new_labels , validate = False )
1606
1612
1607
1613
return result
1608
1614
@@ -1638,7 +1644,7 @@ def __setstate__(self, state):
1638
1644
levels , labels , sortorder , names = own_state
1639
1645
1640
1646
self ._set_levels ([Index (x ) for x in levels ], validate = False )
1641
- self ._set_labels (labels )
1647
+ self ._set_codes (labels )
1642
1648
self ._set_names (names )
1643
1649
self .sortorder = sortorder
1644
1650
self ._verify_integrity ()
0 commit comments