Skip to content

BUG: TypeError when calling unique on empty MultiIndex #20308

Closed
@Liam3851

Description

@Liam3851

Code Sample, a copy-pastable example if possible

import pandas as pd                                   
import numpy as np                                    
x = pd.MultiIndex.from_tuples([(1, 2), (3, 4)], names=['a', 'b'])
y = x[np.array([False, False])] # multiindex y is now empty
y.unique()

-->
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-290d71fd5bc3> in <module>()
      3 x = pd.MultiIndex.from_tuples([(1, 2), (3, 4)]. names=['a', 'b'])
      4 y = x[np.array([False, False])]
----> 5 y.unique()

C:\projects\pandas-dk\pandas\core\indexes\multi.py in unique(self, level)
   1072
   1073         if level is None:
-> 1074             return super(MultiIndex, self).unique()
   1075         else:
   1076             level = self._get_level_number(level)

C:\projects\pandas-dk\pandas\core\indexes\base.py in unique(self, level)
   3971             self._validate_index_level(level)
   3972         result = super(Index, self).unique()
-> 3973         return self._shallow_copy(result)
   3974
   3975     @Appender(base._shared_docs['drop_duplicates'] % _index_doc_kwargs)

C:\projects\pandas-dk\pandas\core\indexes\multi.py in _shallow_copy(self, values, **kwargs)
    559             # discards freq
    560             kwargs.pop('freq', None)
--> 561             return MultiIndex.from_tuples(values, **kwargs)
    562         return self.view()
    563

C:\projects\pandas-dk\pandas\core\indexes\multi.py in from_tuples(cls, tuples, sortorder, names)
   1316             if names is None:
   1317                 msg = 'Cannot infer number of levels from empty list'
-> 1318                 raise TypeError(msg)
   1319             arrays = [[]] * len(names)
   1320         elif isinstance(tuples, (np.ndarray, Index)):

TypeError: Cannot infer number of levels from empty list

Problem description

Looks similar to #16777. Calling unique on an empty single-level index works fine, but doing so on an empty MultiIndex fails. In versions prior to 0.19 MultiIndex.unique on an empty MultiIndex worked (returning an empty array), but now that the array is being wrapped in an index this is causing a failure.

Expected Output

MultiIndex(levels=[[1, 3], [2, 4]],
           labels=[[], []],
           names=['a', 'b'])

Output of pd.show_versions()

INSTALLED VERSIONS

commit: b669112
python: 3.6.4.final.0
python-bits: 64
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 62 Stepping 4, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None
LOCALE: None.None

pandas: 0.23.0.dev0+457.gb669112
pytest: 3.3.2
pip: 9.0.1
setuptools: 38.4.0
Cython: 0.27.3
numpy: 1.14.0
scipy: 1.0.0
pyarrow: 0.8.0
xarray: 0.10.0
IPython: 6.2.1
sphinx: 1.6.6
patsy: 0.5.0
dateutil: 2.6.1
pytz: 2017.3
blosc: None
bottleneck: 1.2.1
tables: 3.4.2
numexpr: 2.6.4
feather: 0.4.0
matplotlib: 2.1.2
openpyxl: 2.4.10
xlrd: 1.1.0
xlwt: 1.3.0
xlsxwriter: 1.0.2
lxml: 4.1.1
bs4: 4.6.0
html5lib: 1.0.1
sqlalchemy: 1.2.1
pymysql: 0.7.11.None
psycopg2: None
jinja2: 2.10
s3fs: 0.1.2
fastparquet: 0.1.4
pandas_gbq: None
pandas_datareader: None

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions