Skip to content

Commit 4645d28

Browse files
committed
rename MultiIndex.labels -> codes
1 parent 1250500 commit 4645d28

File tree

2 files changed

+45
-39
lines changed

2 files changed

+45
-39
lines changed

pandas/core/indexes/multi.py

+44-38
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,12 @@ class MultiIndex(Index):
137137
----------
138138
levels : sequence of arrays
139139
The unique labels for each level
140+
codes : sequence of arrays
141+
Integers for each level designating which label at each location
140142
labels : sequence of arrays
143+
.. deprecated:: 0.24.0
144+
Use ``codes`` instead
145+
141146
Integers for each level designating which label at each location
142147
sortorder : optional int
143148
Level of sortedness (must be lexicographically sorted by that
@@ -181,6 +186,7 @@ class MultiIndex(Index):
181186
----------
182187
names
183188
levels
189+
codes
184190
labels
185191
nlevels
186192
levshape
@@ -206,7 +212,7 @@ class MultiIndex(Index):
206212
_typ = 'multiindex'
207213
_names = FrozenList()
208214
_levels = FrozenList()
209-
_labels = FrozenList()
215+
_codes = FrozenList()
210216
_comparables = ['names']
211217
rename = Index.set_names
212218

@@ -228,7 +234,7 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
228234

229235
# we've already validated levels and labels, so shortcut here
230236
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)
232238

233239
if names is not None:
234240
# handles name validation
@@ -245,39 +251,39 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
245251
result._reset_identity()
246252
return result
247253

248-
def _verify_integrity(self, labels=None, levels=None):
254+
def _verify_integrity(self, codes=None, levels=None):
249255
"""
250256
251257
Parameters
252258
----------
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.
255261
levels : optional list
256262
Levels to check for validity. Defaults to current levels.
257263
258264
Raises
259265
------
260266
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
262268
exceed level bounds, or there are any duplicate levels.
263269
"""
264270
# NOTE: Currently does not check, among other things, that cached
265271
# nlevels matches nor that sortorder matches actually sortorder.
266-
labels = labels or self.labels
272+
codes = codes or self.labels
267273
levels = levels or self.levels
268274

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:"
271277
" 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"
279285
" level (%d). NOTE: this index is in an"
280-
" inconsistent state" % (i, label.max(),
286+
" inconsistent state" % (i, level_codes.max(),
281287
len(level)))
282288
if not level.is_unique:
283289
raise ValueError("Level values must be unique: {values} on "
@@ -415,33 +421,33 @@ def set_levels(self, levels, level=None, inplace=False,
415421

416422
@property
417423
def labels(self):
418-
return self._labels
424+
return self._codes
419425

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):
422428

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.')
427433

428434
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))
432438
else:
433439
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):
436442
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)
440446

441447
if verify_integrity:
442-
self._verify_integrity(labels=new_labels)
448+
self._verify_integrity(codes=new_codes)
443449

444-
self._labels = new_labels
450+
self._codes = new_codes
445451
self._tuples = None
446452
self._reset_cache()
447453

@@ -504,7 +510,7 @@ def set_labels(self, labels, level=None, inplace=False,
504510
else:
505511
idx = self._shallow_copy()
506512
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)
508514
if not inplace:
509515
return idx
510516

@@ -640,7 +646,7 @@ def _format_attrs(self):
640646
attrs = [
641647
('levels', ibase.default_pprint(self._levels,
642648
max_seq_items=False)),
643-
('labels', ibase.default_pprint(self._labels,
649+
('labels', ibase.default_pprint(self._codes,
644650
max_seq_items=False))]
645651
if com._any_not_none(*self.names):
646652
attrs.append(('names', ibase.default_pprint(self.names)))
@@ -1587,7 +1593,7 @@ def remove_unused_levels(self):
15871593
if changed:
15881594
result._reset_identity()
15891595
result._set_levels(new_levels, validate=False)
1590-
result._set_labels(new_labels, validate=False)
1596+
result._set_codes(new_labels, validate=False)
15911597

15921598
return result
15931599

@@ -1623,7 +1629,7 @@ def __setstate__(self, state):
16231629
levels, labels, sortorder, names = own_state
16241630

16251631
self._set_levels([Index(x) for x in levels], validate=False)
1626-
self._set_labels(labels)
1632+
self._set_codes(labels)
16271633
self._set_names(names)
16281634
self.sortorder = sortorder
16291635
self._verify_integrity()

pandas/tests/indexes/multi/test_constructor.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_constructor_mismatched_label_levels(idx):
6767
MultiIndex(levels=levels, labels=labels)
6868

6969
length_error = re.compile('>= length of level')
70-
label_error = re.compile(r'Unequal label lengths: \[4, 2\]')
70+
label_error = re.compile(r'Unequal code lengths: \[4, 2\]')
7171

7272
# important to check that it's looking at the right thing.
7373
with pytest.raises(ValueError, match=length_error):

0 commit comments

Comments
 (0)