@@ -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