Skip to content

Commit 8da59fb

Browse files
committed
rename MultiIndex.labels -> codes
1 parent f2839fe commit 8da59fb

File tree

2 files changed

+45
-39
lines changed

2 files changed

+45
-39
lines changed

pandas/core/indexes/multi.py

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,12 @@ class MultiIndex(Index):
127127
----------
128128
levels : sequence of arrays
129129
The unique labels for each level
130+
codes : sequence of arrays
131+
Integers for each level designating which label at each location
130132
labels : sequence of arrays
133+
.. deprecated:: 0.24.0
134+
Use ``codes`` instead
135+
131136
Integers for each level designating which label at each location
132137
sortorder : optional int
133138
Level of sortedness (must be lexicographically sorted by that
@@ -171,6 +176,7 @@ class MultiIndex(Index):
171176
----------
172177
names
173178
levels
179+
codes
174180
labels
175181
nlevels
176182
levshape
@@ -196,7 +202,7 @@ class MultiIndex(Index):
196202
_typ = 'multiindex'
197203
_names = FrozenList()
198204
_levels = FrozenList()
199-
_labels = FrozenList()
205+
_codes = FrozenList()
200206
_comparables = ['names']
201207
rename = Index.set_names
202208

@@ -218,7 +224,7 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
218224

219225
# we've already validated levels and labels, so shortcut here
220226
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)
222228

223229
if names is not None:
224230
# handles name validation
@@ -235,39 +241,39 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
235241
result._reset_identity()
236242
return result
237243

238-
def _verify_integrity(self, labels=None, levels=None):
244+
def _verify_integrity(self, codes=None, levels=None):
239245
"""
240246
241247
Parameters
242248
----------
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.
245251
levels : optional list
246252
Levels to check for validity. Defaults to current levels.
247253
248254
Raises
249255
------
250256
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
252258
exceed level bounds, or there are any duplicate levels.
253259
"""
254260
# NOTE: Currently does not check, among other things, that cached
255261
# nlevels matches nor that sortorder matches actually sortorder.
256-
labels = labels or self.labels
262+
codes = codes or self.labels
257263
levels = levels or self.levels
258264

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:"
261267
" 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"
269275
" level (%d). NOTE: this index is in an"
270-
" inconsistent state" % (i, label.max(),
276+
" inconsistent state" % (i, level_codes.max(),
271277
len(level)))
272278
if not level.is_unique:
273279
raise ValueError("Level values must be unique: {values} on "
@@ -404,33 +410,33 @@ def set_levels(self, levels, level=None, inplace=False,
404410

405411
@property
406412
def labels(self):
407-
return self._labels
413+
return self._codes
408414

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

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

417423
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))
421427
else:
422428
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):
425431
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)
429435

430436
if verify_integrity:
431-
self._verify_integrity(labels=new_labels)
437+
self._verify_integrity(codes=new_codes)
432438

433-
self._labels = new_labels
439+
self._codes = new_codes
434440
self._tuples = None
435441
self._reset_cache()
436442

@@ -493,7 +499,7 @@ def set_labels(self, labels, level=None, inplace=False,
493499
else:
494500
idx = self._shallow_copy()
495501
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)
497503
if not inplace:
498504
return idx
499505

@@ -629,7 +635,7 @@ def _format_attrs(self):
629635
attrs = [
630636
('levels', ibase.default_pprint(self._levels,
631637
max_seq_items=False)),
632-
('labels', ibase.default_pprint(self._labels,
638+
('labels', ibase.default_pprint(self._codes,
633639
max_seq_items=False))]
634640
if com._any_not_none(*self.names):
635641
attrs.append(('names', ibase.default_pprint(self.names)))
@@ -1574,7 +1580,7 @@ def remove_unused_levels(self):
15741580
if changed:
15751581
result._reset_identity()
15761582
result._set_levels(new_levels, validate=False)
1577-
result._set_labels(new_labels, validate=False)
1583+
result._set_codes(new_labels, validate=False)
15781584

15791585
return result
15801586

@@ -1610,7 +1616,7 @@ def __setstate__(self, state):
16101616
levels, labels, sortorder, names = own_state
16111617

16121618
self._set_levels([Index(x) for x in levels], validate=False)
1613-
self._set_labels(labels)
1619+
self._set_codes(labels)
16141620
self._set_names(names)
16151621
self.sortorder = sortorder
16161622
self._verify_integrity()

pandas/tests/indexes/multi/test_constructor.py

Lines changed: 1 addition & 1 deletion
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)