@@ -676,21 +676,27 @@ def test_from_arrays(self):
676
676
result = MultiIndex .from_arrays (arrays )
677
677
assert list (result ) == list (self .index )
678
678
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
-
688
679
# infer correctly
689
680
result = MultiIndex .from_arrays ([[pd .NaT , Timestamp ('20130101' )],
690
681
['a' , 'b' ]])
691
682
assert result .levels [0 ].equals (Index ([Timestamp ('20130101' )]))
692
683
assert result .levels [1 ].equals (Index (['a' , 'b' ]))
693
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 ))
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
+
694
700
def test_from_arrays_index_series_datetimetz (self ):
695
701
idx1 = pd .date_range ('2015-01-01 10:00' , freq = 'D' , periods = 3 ,
696
702
tz = 'US/Eastern' )
@@ -837,10 +843,20 @@ def test_from_product(self):
837
843
tm .assert_index_equal (result , expected )
838
844
assert result .names == names
839
845
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
+
840
856
# 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
844
860
845
861
# Invalid non-iterable input
846
862
with tm .assert_raises_regex (
@@ -1750,18 +1766,24 @@ def test_from_tuples(self):
1750
1766
names = ['a' , 'b' ])
1751
1767
1752
1768
# 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 )
1756
1772
1773
+ def test_from_tuples_iterator (self ):
1774
+ # GH 18434
1757
1775
# 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 )
1761
1783
1762
1784
# input non-iterables
1763
1785
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.' ):
1765
1787
MultiIndex .from_tuples (0 )
1766
1788
1767
1789
def test_from_tuples_empty (self ):
0 commit comments