@@ -130,19 +130,27 @@ def test_set_index2(self):
130130 result = df .set_index (df .C )
131131 assert result .index .name == 'C'
132132
133- @pytest .mark .parametrize ('level' , ['a' , pd .Series (range (3 ), name = 'a' )])
133+ @pytest .mark .parametrize (
134+ 'level' , ['a' , pd .Series (range (0 , 8 , 2 ), name = 'a' )])
134135 def test_set_index_duplicate_names (self , level ):
135- # GH18872
136+ # GH18872 - GH19029
136137 df = pd .DataFrame (np .arange (8 ).reshape (4 , 2 ), columns = ['a' , 'b' ])
137138
138139 # Pass an existing level name:
139140 df .index .name = 'a'
140- pytest .raises (ValueError , df .set_index , level , append = True )
141- pytest .raises (ValueError , df .set_index , [level ], append = True )
142-
143- # Pass twice the same level name:
144- df .index .name = 'c'
145- pytest .raises (ValueError , df .set_index , [level , level ])
141+ expected = pd .MultiIndex .from_tuples ([(0 , 0 ), (1 , 2 ), (2 , 4 ), (3 , 6 )],
142+ names = ['a' , 'a' ])
143+ result = df .set_index (level , append = True )
144+ tm .assert_index_equal (result .index , expected )
145+ result = df .set_index ([level ], append = True )
146+ tm .assert_index_equal (result .index , expected )
147+
148+ # Pass twice the same level name (only works with passing actual data)
149+ if isinstance (level , pd .Series ):
150+ result = df .set_index ([level , level ])
151+ expected = pd .MultiIndex .from_tuples (
152+ [(0 , 0 ), (2 , 2 ), (4 , 4 ), (6 , 6 )], names = ['a' , 'a' ])
153+ tm .assert_index_equal (result .index , expected )
146154
147155 def test_set_index_nonuniq (self ):
148156 df = DataFrame ({'A' : ['foo' , 'foo' , 'foo' , 'bar' , 'bar' ],
@@ -617,6 +625,19 @@ def test_reorder_levels(self):
617625 index = e_idx )
618626 assert_frame_equal (result , expected )
619627
628+ result = df .reorder_levels ([0 , 0 , 0 ])
629+ e_idx = MultiIndex (levels = [['bar' ], ['bar' ], ['bar' ]],
630+ labels = [[0 , 0 , 0 , 0 , 0 , 0 ],
631+ [0 , 0 , 0 , 0 , 0 , 0 ],
632+ [0 , 0 , 0 , 0 , 0 , 0 ]],
633+ names = ['L0' , 'L0' , 'L0' ])
634+ expected = DataFrame ({'A' : np .arange (6 ), 'B' : np .arange (6 )},
635+ index = e_idx )
636+ assert_frame_equal (result , expected )
637+
638+ result = df .reorder_levels (['L0' , 'L0' , 'L0' ])
639+ assert_frame_equal (result , expected )
640+
620641 def test_reset_index (self ):
621642 stacked = self .frame .stack ()[::2 ]
622643 stacked = DataFrame ({'foo' : stacked , 'bar' : stacked })
0 commit comments