33 timedelta ,
44)
55import inspect
6- from itertools import permutations
76
87import numpy as np
98import pytest
@@ -339,23 +338,24 @@ def test_reindex_limit(self):
339338 expected = DataFrame (exp_data )
340339 tm .assert_frame_equal (result , expected )
341340
342- def test_reindex_level (self ):
343- icol = ["jim" , "joe" , "jolie" ]
344-
345- def verify_first_level (df , level , idx , check_index_type = True ):
346- def f (val ):
347- return np .nonzero ((df [level ] == val ).to_numpy ())[0 ]
348-
349- i = np .concatenate (list (map (f , idx )))
350- left = df .set_index (icol ).reindex (idx , level = level )
351- right = df .iloc [i ].set_index (icol )
352- tm .assert_frame_equal (left , right , check_index_type = check_index_type )
353-
354- def verify (df , level , idx , indexer , check_index_type = True ):
355- left = df .set_index (icol ).reindex (idx , level = level )
356- right = df .iloc [indexer ].set_index (icol )
357- tm .assert_frame_equal (left , right , check_index_type = check_index_type )
358-
341+ @pytest .mark .parametrize (
342+ "idx, check_index_type" ,
343+ [
344+ [["C" , "B" , "A" ], True ],
345+ [["F" , "C" , "A" , "D" ], True ],
346+ [["A" ], True ],
347+ [["A" , "B" , "C" ], True ],
348+ [["C" , "A" , "B" ], True ],
349+ [["C" , "B" ], True ],
350+ [["C" , "A" ], True ],
351+ [["A" , "B" ], True ],
352+ [["B" , "A" , "C" ], True ],
353+ # reindex by these causes different MultiIndex levels
354+ [["D" , "F" ], False ],
355+ [["A" , "C" , "B" ], False ],
356+ ],
357+ )
358+ def test_reindex_level_verify_first_level (self , idx , check_index_type ):
359359 df = DataFrame (
360360 {
361361 "jim" : list ("B" * 4 + "A" * 2 + "C" * 3 ),
@@ -364,35 +364,40 @@ def verify(df, level, idx, indexer, check_index_type=True):
364364 "joline" : np .random .randint (0 , 1000 , 9 ),
365365 }
366366 )
367+ icol = ["jim" , "joe" , "jolie" ]
367368
368- target = [
369- ["C" , "B" , "A" ],
370- ["F" , "C" , "A" , "D" ],
371- ["A" ],
372- ["A" , "B" , "C" ],
373- ["C" , "A" , "B" ],
374- ["C" , "B" ],
375- ["C" , "A" ],
376- ["A" , "B" ],
377- ["B" , "A" , "C" ],
378- ]
379-
380- for idx in target :
381- verify_first_level (df , "jim" , idx )
382-
383- # reindex by these causes different MultiIndex levels
384- for idx in [["D" , "F" ], ["A" , "C" , "B" ]]:
385- verify_first_level (df , "jim" , idx , check_index_type = False )
369+ def f (val ):
370+ return np .nonzero ((df ["jim" ] == val ).to_numpy ())[0 ]
386371
387- verify (df , "joe" , list ("abcde" ), [3 , 2 , 1 , 0 , 5 , 4 , 8 , 7 , 6 ])
388- verify (df , "joe" , list ("abcd" ), [3 , 2 , 1 , 0 , 5 , 8 , 7 , 6 ])
389- verify (df , "joe" , list ("abc" ), [3 , 2 , 1 , 8 , 7 , 6 ])
390- verify (df , "joe" , list ("eca" ), [1 , 3 , 4 , 6 , 8 ])
391- verify (df , "joe" , list ("edc" ), [0 , 1 , 4 , 5 , 6 ])
392- verify (df , "joe" , list ("eadbc" ), [3 , 0 , 2 , 1 , 4 , 5 , 8 , 7 , 6 ])
393- verify (df , "joe" , list ("edwq" ), [0 , 4 , 5 ])
394- verify (df , "joe" , list ("wq" ), [], check_index_type = False )
372+ i = np .concatenate (list (map (f , idx )))
373+ left = df .set_index (icol ).reindex (idx , level = "jim" )
374+ right = df .iloc [i ].set_index (icol )
375+ tm .assert_frame_equal (left , right , check_index_type = check_index_type )
395376
377+ @pytest .mark .parametrize (
378+ "idx" ,
379+ [
380+ ("mid" ,),
381+ ("mid" , "btm" ),
382+ ("mid" , "btm" , "top" ),
383+ ("mid" ,),
384+ ("mid" , "top" ),
385+ ("mid" , "top" , "btm" ),
386+ ("btm" ,),
387+ ("btm" , "mid" ),
388+ ("btm" , "mid" , "top" ),
389+ ("btm" ,),
390+ ("btm" , "top" ),
391+ ("btm" , "top" , "mid" ),
392+ ("top" ,),
393+ ("top" , "mid" ),
394+ ("top" , "mid" , "btm" ),
395+ ("top" ,),
396+ ("top" , "btm" ),
397+ ("top" , "btm" , "mid" ),
398+ ],
399+ )
400+ def test_reindex_level_verify_first_level_repeats (self , idx ):
396401 df = DataFrame (
397402 {
398403 "jim" : ["mid" ] * 5 + ["btm" ] * 8 + ["top" ] * 7 ,
@@ -416,22 +421,86 @@ def verify(df, level, idx, indexer, check_index_type=True):
416421 "joline" : np .random .randn (20 ).round (3 ) * 10 ,
417422 }
418423 )
424+ icol = ["jim" , "joe" , "jolie" ]
419425
420- for idx in permutations (df ["jim" ].unique ()):
421- for i in range (3 ):
422- verify_first_level (df , "jim" , idx [: i + 1 ])
423-
424- i = [2 , 3 , 4 , 0 , 1 , 8 , 9 , 5 , 6 , 7 , 10 , 11 , 12 , 13 , 14 , 18 , 19 , 15 , 16 , 17 ]
425- verify (df , "joe" , ["1st" , "2nd" , "3rd" ], i )
426+ def f (val ):
427+ return np .nonzero ((df ["jim" ] == val ).to_numpy ())[0 ]
426428
427- i = [0 , 1 , 2 , 3 , 4 , 10 , 11 , 12 , 5 , 6 , 7 , 8 , 9 , 15 , 16 , 17 , 18 , 19 , 13 , 14 ]
428- verify (df , "joe" , ["3rd" , "2nd" , "1st" ], i )
429+ i = np .concatenate (list (map (f , idx )))
430+ left = df .set_index (icol ).reindex (idx , level = "jim" )
431+ right = df .iloc [i ].set_index (icol )
432+ tm .assert_frame_equal (left , right )
429433
430- i = [0 , 1 , 5 , 6 , 7 , 10 , 11 , 12 , 18 , 19 , 15 , 16 , 17 ]
431- verify (df , "joe" , ["2nd" , "3rd" ], i )
434+ @pytest .mark .parametrize (
435+ "idx, indexer" ,
436+ [
437+ [
438+ ["1st" , "2nd" , "3rd" ],
439+ [2 , 3 , 4 , 0 , 1 , 8 , 9 , 5 , 6 , 7 , 10 , 11 , 12 , 13 , 14 , 18 , 19 , 15 , 16 , 17 ],
440+ ],
441+ [
442+ ["3rd" , "2nd" , "1st" ],
443+ [0 , 1 , 2 , 3 , 4 , 10 , 11 , 12 , 5 , 6 , 7 , 8 , 9 , 15 , 16 , 17 , 18 , 19 , 13 , 14 ],
444+ ],
445+ [["2nd" , "3rd" ], [0 , 1 , 5 , 6 , 7 , 10 , 11 , 12 , 18 , 19 , 15 , 16 , 17 ]],
446+ [["3rd" , "1st" ], [0 , 1 , 2 , 3 , 4 , 10 , 11 , 12 , 8 , 9 , 15 , 16 , 17 , 13 , 14 ]],
447+ ],
448+ )
449+ def test_reindex_level_verify_repeats (self , idx , indexer ):
450+ df = DataFrame (
451+ {
452+ "jim" : ["mid" ] * 5 + ["btm" ] * 8 + ["top" ] * 7 ,
453+ "joe" : ["3rd" ] * 2
454+ + ["1st" ] * 3
455+ + ["2nd" ] * 3
456+ + ["1st" ] * 2
457+ + ["3rd" ] * 3
458+ + ["1st" ] * 2
459+ + ["3rd" ] * 3
460+ + ["2nd" ] * 2 ,
461+ # this needs to be jointly unique with jim and joe or
462+ # reindexing will fail ~1.5% of the time, this works
463+ # out to needing unique groups of same size as joe
464+ "jolie" : np .concatenate (
465+ [
466+ np .random .choice (1000 , x , replace = False )
467+ for x in [2 , 3 , 3 , 2 , 3 , 2 , 3 , 2 ]
468+ ]
469+ ),
470+ "joline" : np .random .randn (20 ).round (3 ) * 10 ,
471+ }
472+ )
473+ icol = ["jim" , "joe" , "jolie" ]
474+ left = df .set_index (icol ).reindex (idx , level = "joe" )
475+ right = df .iloc [indexer ].set_index (icol )
476+ tm .assert_frame_equal (left , right )
432477
433- i = [0 , 1 , 2 , 3 , 4 , 10 , 11 , 12 , 8 , 9 , 15 , 16 , 17 , 13 , 14 ]
434- verify (df , "joe" , ["3rd" , "1st" ], i )
478+ @pytest .mark .parametrize (
479+ "idx, indexer, check_index_type" ,
480+ [
481+ [list ("abcde" ), [3 , 2 , 1 , 0 , 5 , 4 , 8 , 7 , 6 ], True ],
482+ [list ("abcd" ), [3 , 2 , 1 , 0 , 5 , 8 , 7 , 6 ], True ],
483+ [list ("abc" ), [3 , 2 , 1 , 8 , 7 , 6 ], True ],
484+ [list ("eca" ), [1 , 3 , 4 , 6 , 8 ], True ],
485+ [list ("edc" ), [0 , 1 , 4 , 5 , 6 ], True ],
486+ [list ("eadbc" ), [3 , 0 , 2 , 1 , 4 , 5 , 8 , 7 , 6 ], True ],
487+ [list ("edwq" ), [0 , 4 , 5 ], True ],
488+ [list ("wq" ), [], False ],
489+ ],
490+ )
491+ def test_reindex_level_verify (self , idx , indexer , check_index_type ):
492+ df = DataFrame (
493+ {
494+ "jim" : list ("B" * 4 + "A" * 2 + "C" * 3 ),
495+ "joe" : list ("abcdeabcd" )[::- 1 ],
496+ "jolie" : [10 , 20 , 30 ] * 3 ,
497+ "joline" : np .random .randint (0 , 1000 , 9 ),
498+ }
499+ )
500+ icol = ["jim" , "joe" , "jolie" ]
501+ left = df .set_index (icol ).reindex (idx , level = "joe" )
502+ right = df .iloc [indexer ].set_index (icol )
503+ tm .assert_frame_equal (left , right , check_index_type = check_index_type )
435504
436505 def test_non_monotonic_reindex_methods (self ):
437506 dr = date_range ("2013-08-01" , periods = 6 , freq = "B" )
0 commit comments