Closed
Description
import pandas as pd
idx = pd.MultiIndex.from_tuples([(0, i) for i in range(130)])
print idx.labels[1].dtype
# --> int16
idx.set_labels(labels=idx.labels[1], level=1, inplace=True)
print idx.labels[1].dtype
# --> int8
Imho this is caused by the following line, because the erratic assumption that the indices of labels
and self.levels
would be index-aligned.
https://github.com/pandas-dev/pandas/blame/master/pandas/core/indexes/multi.py#L331
Hence the call to coerce_indexer_dtype
casts the given labels
to int8. This is because its l'ooking at the number of categories in level 0.
I would suggest to replace
for l, lev, lab in zip(level, self.levels, labels):
new_labels[l] = _ensure_frozen(
lab, lev, copy=copy)._shallow_copy()
with
for l, lab in zip(level, labels):
lev = self.levels[l]
new_labels[l] = _ensure_frozen(
lab, lev, copy=copy)._shallow_copy()