Skip to content

Commit 9ceadbe

Browse files
committed
Make an independent test case for 18434
1 parent fb0dac9 commit 9ceadbe

File tree

2 files changed

+42
-20
lines changed

2 files changed

+42
-20
lines changed

pandas/core/indexes/multi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1212,7 +1212,7 @@ def from_tuples(cls, tuples, sortorder=None, names=None):
12121212
of iterables
12131213
"""
12141214
if not is_list_like(tuples):
1215-
raise TypeError('Input must be a list /sequence of tuple-likes.')
1215+
raise TypeError('Input must be a list / sequence of tuple-likes.')
12161216
elif is_iterator(tuples):
12171217
tuples = list(tuples)
12181218

pandas/tests/indexes/test_multi.py

+41-19
Original file line numberDiff line numberDiff line change
@@ -676,21 +676,27 @@ def test_from_arrays(self):
676676
result = MultiIndex.from_arrays(arrays)
677677
assert list(result) == list(self.index)
678678

679-
# iterator as input
680-
result2 = MultiIndex.from_arrays(iter(arrays))
681-
assert list(result2) == list(self.index)
682-
683-
# invlide iterator input
684-
with tm.assert_raises_regex(
685-
TypeError, "Input must be a list / sequence of array-likes."):
686-
MultiIndex.from_arrays(0)
687-
688679
# infer correctly
689680
result = MultiIndex.from_arrays([[pd.NaT, Timestamp('20130101')],
690681
['a', 'b']])
691682
assert result.levels[0].equals(Index([Timestamp('20130101')]))
692683
assert result.levels[1].equals(Index(['a', 'b']))
693684

685+
def test_from_arrays_iterator(self):
686+
# GH 18434
687+
arrays = []
688+
for lev, lab in zip(self.index.levels, self.index.labels):
689+
arrays.append(np.asarray(lev).take(lab))
690+
691+
# iterator as input
692+
result = MultiIndex.from_arrays(iter(arrays))
693+
assert list(result) == list(self.index)
694+
695+
# invalid iterator input
696+
with tm.assert_raises_regex(
697+
TypeError, "Input must be a list / sequence of array-likes."):
698+
MultiIndex.from_arrays(0)
699+
694700
def test_from_arrays_index_series_datetimetz(self):
695701
idx1 = pd.date_range('2015-01-01 10:00', freq='D', periods=3,
696702
tz='US/Eastern')
@@ -837,10 +843,20 @@ def test_from_product(self):
837843
tm.assert_index_equal(result, expected)
838844
assert result.names == names
839845

846+
def test_from_product_iterator(self):
847+
# GH 18434
848+
first = ['foo', 'bar', 'buz']
849+
second = ['a', 'b', 'c']
850+
names = ['first', 'second']
851+
tuples = [('foo', 'a'), ('foo', 'b'), ('foo', 'c'), ('bar', 'a'),
852+
('bar', 'b'), ('bar', 'c'), ('buz', 'a'), ('buz', 'b'),
853+
('buz', 'c')]
854+
expected = MultiIndex.from_tuples(tuples, names=names)
855+
840856
# iterator as input
841-
result2 = MultiIndex.from_product(iter([first, second]), names=names)
842-
assert result2.equals(expected)
843-
assert result2.names == names
857+
result = MultiIndex.from_product(iter([first, second]), names=names)
858+
assert result.equals(expected)
859+
assert result.names == names
844860

845861
# Invalid non-iterable input
846862
with tm.assert_raises_regex(
@@ -1750,18 +1766,24 @@ def test_from_tuples(self):
17501766
names=['a', 'b'])
17511767

17521768
# input tuples
1753-
res1 = MultiIndex.from_tuples(((1, 2), (3, 4)), names=['a', 'b'])
1754-
assert expected.names == res1.names
1755-
assert res1.equals(expected)
1769+
result = MultiIndex.from_tuples(((1, 2), (3, 4)), names=['a', 'b'])
1770+
assert expected.names == result.names
1771+
assert result.equals(expected)
17561772

1773+
def test_from_tuples_iterator(self):
1774+
# GH 18434
17571775
# input iterator for tuples
1758-
res2 = MultiIndex.from_tuples(zip([1, 3], [2, 4]), names=['a', 'b'])
1759-
assert expected.names == res2.names
1760-
assert res2.equals(expected)
1776+
expected = MultiIndex(levels=[[1, 3], [2, 4]],
1777+
labels=[[0, 1], [0, 1]],
1778+
names=['a', 'b'])
1779+
1780+
result = MultiIndex.from_tuples(zip([1, 3], [2, 4]), names=['a', 'b'])
1781+
assert expected.names == result.names
1782+
assert result.equals(expected)
17611783

17621784
# input non-iterables
17631785
with tm.assert_raises_regex(
1764-
TypeError, 'Input must be a list /sequence of tuple-likes.'):
1786+
TypeError, 'Input must be a list / sequence of tuple-likes.'):
17651787
MultiIndex.from_tuples(0)
17661788

17671789
def test_from_tuples_empty(self):

0 commit comments

Comments
 (0)