@@ -672,15 +672,31 @@ 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- result = MultiIndex .from_arrays (arrays )
676- assert list (result ) == list (self .index )
675+ # list of arrays as input
676+ result = MultiIndex .from_arrays (arrays , names = self .index .names )
677+ tm .assert_index_equal (result , self .index )
677678
678679 # infer correctly
679680 result = MultiIndex .from_arrays ([[pd .NaT , Timestamp ('20130101' )],
680681 ['a' , 'b' ]])
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 ), names = self .index .names )
693+ tm .assert_index_equal (result , 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' )
@@ -825,7 +841,25 @@ def test_from_product(self):
825841 expected = MultiIndex .from_tuples (tuples , names = names )
826842
827843 tm .assert_index_equal (result , expected )
828- assert result .names == names
844+
845+ def test_from_product_iterator (self ):
846+ # GH 18434
847+ first = ['foo' , 'bar' , 'buz' ]
848+ second = ['a' , 'b' , 'c' ]
849+ names = ['first' , 'second' ]
850+ tuples = [('foo' , 'a' ), ('foo' , 'b' ), ('foo' , 'c' ), ('bar' , 'a' ),
851+ ('bar' , 'b' ), ('bar' , 'c' ), ('buz' , 'a' ), ('buz' , 'b' ),
852+ ('buz' , 'c' )]
853+ expected = MultiIndex .from_tuples (tuples , names = names )
854+
855+ # iterator as input
856+ result = MultiIndex .from_product (iter ([first , second ]), names = names )
857+ tm .assert_index_equal (result , expected )
858+
859+ # Invalid non-iterable input
860+ with tm .assert_raises_regex (
861+ TypeError , "Input must be a list / sequence of iterables." ):
862+ MultiIndex .from_product (0 )
829863
830864 def test_from_product_empty (self ):
831865 # 0 levels
@@ -1725,8 +1759,28 @@ def test_from_tuples(self):
17251759 'from empty list' ,
17261760 MultiIndex .from_tuples , [])
17271761
1728- idx = MultiIndex .from_tuples (((1 , 2 ), (3 , 4 )), names = ['a' , 'b' ])
1729- assert len (idx ) == 2
1762+ expected = MultiIndex (levels = [[1 , 3 ], [2 , 4 ]],
1763+ labels = [[0 , 1 ], [0 , 1 ]],
1764+ names = ['a' , 'b' ])
1765+
1766+ # input tuples
1767+ result = MultiIndex .from_tuples (((1 , 2 ), (3 , 4 )), names = ['a' , 'b' ])
1768+ tm .assert_index_equal (result , expected )
1769+
1770+ def test_from_tuples_iterator (self ):
1771+ # GH 18434
1772+ # input iterator for tuples
1773+ expected = MultiIndex (levels = [[1 , 3 ], [2 , 4 ]],
1774+ labels = [[0 , 1 ], [0 , 1 ]],
1775+ names = ['a' , 'b' ])
1776+
1777+ result = MultiIndex .from_tuples (zip ([1 , 3 ], [2 , 4 ]), names = ['a' , 'b' ])
1778+ tm .assert_index_equal (result , expected )
1779+
1780+ # input non-iterables
1781+ with tm .assert_raises_regex (
1782+ TypeError , 'Input must be a list / sequence of tuple-likes.' ):
1783+ MultiIndex .from_tuples (0 )
17301784
17311785 def test_from_tuples_empty (self ):
17321786 # GH 16777
0 commit comments