Skip to content

Bug in set_labels of MultiIndex #19057

Closed
@Mofef

Description

@Mofef
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()

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions