Skip to content

Commit ed47074

Browse files
Douglas RuddTomAugspurger
Douglas Rudd
authored andcommitted
BUG: allow empty multiindex (fixes .isin regression, GH16777) (pandas-dev#16782)
(cherry picked from commit 500cd0f)
1 parent 9dd351f commit ed47074

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

doc/source/whatsnew/v0.20.3.txt

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ Indexing
5555
^^^^^^^^
5656

5757
- Bug in ``Float64Index`` causing an empty array instead of ``None`` to be returned from ``.get(np.nan)`` on a Series whose index did not contain any ``NaN`` s (:issue:`8569`)
58+
- Bug in ``MultiIndex.isin`` causing an error when passing an empty iterable (:issue:`16777`)
5859

5960
I/O
6061
^^^

pandas/core/indexes/multi.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -1134,10 +1134,11 @@ def from_tuples(cls, tuples, sortorder=None, names=None):
11341134
of iterables
11351135
"""
11361136
if len(tuples) == 0:
1137-
# I think this is right? Not quite sure...
1138-
raise TypeError('Cannot infer number of levels from empty list')
1139-
1140-
if isinstance(tuples, (np.ndarray, Index)):
1137+
if names is None:
1138+
msg = 'Cannot infer number of levels from empty list'
1139+
raise TypeError(msg)
1140+
arrays = [[]] * len(names)
1141+
elif isinstance(tuples, (np.ndarray, Index)):
11411142
if isinstance(tuples, Index):
11421143
tuples = tuples._values
11431144

@@ -2626,8 +2627,9 @@ def _wrap_joined_index(self, joined, other):
26262627
@Appender(Index.isin.__doc__)
26272628
def isin(self, values, level=None):
26282629
if level is None:
2629-
return algos.isin(self.values,
2630-
MultiIndex.from_tuples(values).values)
2630+
values = MultiIndex.from_tuples(values,
2631+
names=self.names).values
2632+
return algos.isin(self.values, values)
26312633
else:
26322634
num = self._get_level_number(level)
26332635
levs = self.levels[num]

pandas/tests/indexes/test_multi.py

+7
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,13 @@ def test_from_tuples(self):
17201720
idx = MultiIndex.from_tuples(((1, 2), (3, 4)), names=['a', 'b'])
17211721
assert len(idx) == 2
17221722

1723+
def test_from_tuples_empty(self):
1724+
# GH 16777
1725+
result = MultiIndex.from_tuples([], names=['a', 'b'])
1726+
expected = MultiIndex.from_arrays(arrays=[[], []],
1727+
names=['a', 'b'])
1728+
tm.assert_index_equal(result, expected)
1729+
17231730
def test_argsort(self):
17241731
result = self.index.argsort()
17251732
expected = self.index.values.argsort()

0 commit comments

Comments
 (0)