@@ -672,6 +672,7 @@ def test_from_arrays(self):
672672 for lev , lab in zip (self .index .levels , self .index .labels ):
673673 arrays .append (np .asarray (lev ).take (lab ))
674674
675+ # list of arrays as input
675676 result = MultiIndex .from_arrays (arrays )
676677 assert list (result ) == list (self .index )
677678
@@ -681,6 +682,21 @@ def test_from_arrays(self):
681682 assert result .levels [0 ].equals (Index ([Timestamp ('20130101' )]))
682683 assert result .levels [1 ].equals (Index (['a' , 'b' ]))
683684
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+
684700 def test_from_arrays_index_series_datetimetz (self ):
685701 idx1 = pd .date_range ('2015-01-01 10:00' , freq = 'D' , periods = 3 ,
686702 tz = 'US/Eastern' )
@@ -827,6 +843,26 @@ def test_from_product(self):
827843 tm .assert_index_equal (result , expected )
828844 assert result .names == names
829845
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+
856+ # iterator as input
857+ result = MultiIndex .from_product (iter ([first , second ]), names = names )
858+ assert result .equals (expected )
859+ assert result .names == names
860+
861+ # Invalid non-iterable input
862+ with tm .assert_raises_regex (
863+ TypeError , "Input must be a list / sequence of iterables." ):
864+ MultiIndex .from_product (0 )
865+
830866 def test_from_product_empty (self ):
831867 # 0 levels
832868 with tm .assert_raises_regex (
@@ -1725,8 +1761,30 @@ def test_from_tuples(self):
17251761 'from empty list' ,
17261762 MultiIndex .from_tuples , [])
17271763
1728- idx = MultiIndex .from_tuples (((1 , 2 ), (3 , 4 )), names = ['a' , 'b' ])
1729- assert len (idx ) == 2
1764+ expected = MultiIndex (levels = [[1 , 3 ], [2 , 4 ]],
1765+ labels = [[0 , 1 ], [0 , 1 ]],
1766+ names = ['a' , 'b' ])
1767+
1768+ # input tuples
1769+ result = MultiIndex .from_tuples (((1 , 2 ), (3 , 4 )), names = ['a' , 'b' ])
1770+ assert expected .names == result .names
1771+ assert result .equals (expected )
1772+
1773+ def test_from_tuples_iterator (self ):
1774+ # GH 18434
1775+ # input iterator for tuples
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 )
1783+
1784+ # input non-iterables
1785+ with tm .assert_raises_regex (
1786+ TypeError , 'Input must be a list / sequence of tuple-likes.' ):
1787+ MultiIndex .from_tuples (0 )
17301788
17311789 def test_from_tuples_empty (self ):
17321790 # GH 16777
0 commit comments