@@ -672,15 +672,31 @@ def test_from_arrays(self):
672
672
for lev , lab in zip (self .index .levels , self .index .labels ):
673
673
arrays .append (np .asarray (lev ).take (lab ))
674
674
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 )
677
678
678
679
# infer correctly
679
680
result = MultiIndex .from_arrays ([[pd .NaT , Timestamp ('20130101' )],
680
681
['a' , 'b' ]])
681
682
assert result .levels [0 ].equals (Index ([Timestamp ('20130101' )]))
682
683
assert result .levels [1 ].equals (Index (['a' , 'b' ]))
683
684
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
+
684
700
def test_from_arrays_index_series_datetimetz (self ):
685
701
idx1 = pd .date_range ('2015-01-01 10:00' , freq = 'D' , periods = 3 ,
686
702
tz = 'US/Eastern' )
@@ -825,7 +841,25 @@ def test_from_product(self):
825
841
expected = MultiIndex .from_tuples (tuples , names = names )
826
842
827
843
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 )
829
863
830
864
def test_from_product_empty (self ):
831
865
# 0 levels
@@ -1725,8 +1759,28 @@ def test_from_tuples(self):
1725
1759
'from empty list' ,
1726
1760
MultiIndex .from_tuples , [])
1727
1761
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 )
1730
1784
1731
1785
def test_from_tuples_empty (self ):
1732
1786
# GH 16777
0 commit comments