@@ -130,19 +130,27 @@ def test_set_index2(self):
130
130
result = df .set_index (df .C )
131
131
assert result .index .name == 'C'
132
132
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' )])
134
135
def test_set_index_duplicate_names (self , level ):
135
- # GH18872
136
+ # GH18872 - GH19029
136
137
df = pd .DataFrame (np .arange (8 ).reshape (4 , 2 ), columns = ['a' , 'b' ])
137
138
138
139
# Pass an existing level name:
139
140
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 )
146
154
147
155
def test_set_index_nonuniq (self ):
148
156
df = DataFrame ({'A' : ['foo' , 'foo' , 'foo' , 'bar' , 'bar' ],
@@ -617,6 +625,19 @@ def test_reorder_levels(self):
617
625
index = e_idx )
618
626
assert_frame_equal (result , expected )
619
627
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
+
620
641
def test_reset_index (self ):
621
642
stacked = self .frame .stack ()[::2 ]
622
643
stacked = DataFrame ({'foo' : stacked , 'bar' : stacked })
0 commit comments