Skip to content

Commit 2851225

Browse files
committed
rename MultiIndex.labels -> codes
1 parent 9f2c716 commit 2851225

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
@@ -126,7 +126,12 @@ class MultiIndex(Index):
126126
----------
127127
levels : sequence of arrays
128128
The unique labels for each level
129+
codes : sequence of arrays
130+
Integers for each level designating which label at each location
129131
labels : sequence of arrays
132+
.. deprecated:: 0.24.0
133+
Use ``codes`` instead
134+
130135
Integers for each level designating which label at each location
131136
sortorder : optional int
132137
Level of sortedness (must be lexicographically sorted by that
@@ -170,6 +175,7 @@ class MultiIndex(Index):
170175
----------
171176
names
172177
levels
178+
codes
173179
labels
174180
nlevels
175181
levshape
@@ -195,7 +201,7 @@ class MultiIndex(Index):
195201
_typ = 'multiindex'
196202
_names = FrozenList()
197203
_levels = FrozenList()
198-
_labels = FrozenList()
204+
_codes = FrozenList()
199205
_comparables = ['names']
200206
rename = Index.set_names
201207

@@ -220,7 +226,7 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
220226

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

225231
if names is not None:
226232
# handles name validation
@@ -237,39 +243,39 @@ def __new__(cls, levels=None, labels=None, sortorder=None, names=None,
237243
result._reset_identity()
238244
return result
239245

240-
def _verify_integrity(self, labels=None, levels=None):
246+
def _verify_integrity(self, codes=None, levels=None):
241247
"""
242248
243249
Parameters
244250
----------
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.
247253
levels : optional list
248254
Levels to check for validity. Defaults to current levels.
249255
250256
Raises
251257
------
252258
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
254260
exceed level bounds, or there are any duplicate levels.
255261
"""
256262
# NOTE: Currently does not check, among other things, that cached
257263
# nlevels matches nor that sortorder matches actually sortorder.
258-
labels = labels or self.labels
264+
codes = codes or self.labels
259265
levels = levels or self.levels
260266

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:"
263269
" 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"
271277
" level (%d). NOTE: this index is in an"
272-
" inconsistent state" % (i, label.max(),
278+
" inconsistent state" % (i, level_codes.max(),
273279
len(level)))
274280
if not level.is_unique:
275281
raise ValueError("Level values must be unique: {values} on "
@@ -573,33 +579,33 @@ def set_levels(self, levels, level=None, inplace=False,
573579

574580
@property
575581
def labels(self):
576-
return self._labels
582+
return self._codes
577583

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

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

586592
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))
590596
else:
591597
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):
594600
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)
598604

599605
if verify_integrity:
600-
self._verify_integrity(labels=new_labels)
606+
self._verify_integrity(codes=new_codes)
601607

602-
self._labels = new_labels
608+
self._codes = new_codes
603609
self._tuples = None
604610
self._reset_cache()
605611

@@ -662,7 +668,7 @@ def set_labels(self, labels, level=None, inplace=False,
662668
else:
663669
idx = self._shallow_copy()
664670
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)
666672
if not inplace:
667673
return idx
668674

@@ -801,7 +807,7 @@ def _format_attrs(self):
801807
attrs = [
802808
('levels', ibase.default_pprint(self._levels,
803809
max_seq_items=False)),
804-
('labels', ibase.default_pprint(self._labels,
810+
('labels', ibase.default_pprint(self._codes,
805811
max_seq_items=False))]
806812
if com._any_not_none(*self.names):
807813
attrs.append(('names', ibase.default_pprint(self.names)))
@@ -1602,7 +1608,7 @@ def remove_unused_levels(self):
16021608
if changed:
16031609
result._reset_identity()
16041610
result._set_levels(new_levels, validate=False)
1605-
result._set_labels(new_labels, validate=False)
1611+
result._set_codes(new_labels, validate=False)
16061612

16071613
return result
16081614

@@ -1638,7 +1644,7 @@ def __setstate__(self, state):
16381644
levels, labels, sortorder, names = own_state
16391645

16401646
self._set_levels([Index(x) for x in levels], validate=False)
1641-
self._set_labels(labels)
1647+
self._set_codes(labels)
16421648
self._set_names(names)
16431649
self.sortorder = sortorder
16441650
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)