@@ -2449,6 +2449,31 @@ def test_getitem_slice_not_sorted(self):
2449
2449
expected = df .reindex (columns = df .columns [:3 ])
2450
2450
tm .assert_frame_equal (result , expected )
2451
2451
2452
+ @pytest .mark .xfail (reason = "need axis reconstruction" )
2453
+ def test_frame_getitem_not_sorted2 (self ):
2454
+ # 13431
2455
+ df = DataFrame ({'col1' : ['b' , 'd' , 'b' , 'a' ],
2456
+ 'col2' : [3 , 1 , 1 , 2 ],
2457
+ 'data' : ['one' , 'two' , 'three' , 'four' ]})
2458
+
2459
+ df2 = df .set_index (['col1' , 'col2' ])
2460
+ df2_original = df2 .copy ()
2461
+
2462
+ df2 .index .set_levels (['b' , 'd' , 'a' ], level = 'col1' , inplace = True )
2463
+ df2 .index .set_labels ([0 , 1 , 0 , 2 ], level = 'col1' , inplace = True )
2464
+ assert not df2 .index .is_lexsorted ()
2465
+ assert not df2 .index .is_monotonic
2466
+
2467
+ assert df2_original .index .equals (df2 .index )
2468
+
2469
+ result = df2 .sort_index ()
2470
+ assert result .index .is_lexsorted ()
2471
+ assert result .index .is_monotonic
2472
+
2473
+ result = df2 .sort_index (level = 0 )
2474
+ assert result .index .is_lexsorted ()
2475
+ assert result .index .is_monotonic
2476
+
2452
2477
def test_frame_getitem_not_sorted (self ):
2453
2478
df = self .frame .T
2454
2479
df ['foo' , 'four' ] = 'foo'
@@ -2485,3 +2510,89 @@ def test_series_getitem_not_sorted(self):
2485
2510
expected .index = expected .index .droplevel (0 )
2486
2511
tm .assert_series_equal (result , expected )
2487
2512
tm .assert_series_equal (result2 , expected )
2513
+
2514
+ def test_sort_index_and_reconstruction (self ):
2515
+
2516
+ # 15622
2517
+ # lexsortedness should be identical
2518
+ # across MultiIndex consruction methods
2519
+
2520
+ df = DataFrame ([[1 , 1 ], [2 , 2 ]], index = list ('ab' ))
2521
+ expected = DataFrame ([[1 , 1 ], [2 , 2 ], [1 , 1 ], [2 , 2 ]],
2522
+ index = MultiIndex .from_tuples ([(0.5 , 'a' ),
2523
+ (0.5 , 'b' ),
2524
+ (0.8 , 'a' ),
2525
+ (0.8 , 'b' )]))
2526
+ assert expected .index .is_lexsorted ()
2527
+
2528
+ result = DataFrame (
2529
+ [[1 , 1 ], [2 , 2 ], [1 , 1 ], [2 , 2 ]],
2530
+ index = MultiIndex .from_product ([[0.5 , 0.8 ], list ('ab' )]))
2531
+ result = result .sort_index ()
2532
+ assert result .index .is_lexsorted ()
2533
+ assert result .index .is_monotonic
2534
+
2535
+ tm .assert_frame_equal (result , expected )
2536
+
2537
+ result = DataFrame (
2538
+ [[1 , 1 ], [2 , 2 ], [1 , 1 ], [2 , 2 ]],
2539
+ index = MultiIndex (levels = [[0.5 , 0.8 ], ['a' , 'b' ]],
2540
+ labels = [[0 , 0 , 1 , 1 ], [0 , 1 , 0 , 1 ]]))
2541
+ result = result .sort_index ()
2542
+ assert result .index .is_lexsorted ()
2543
+
2544
+ tm .assert_frame_equal (result , expected )
2545
+
2546
+ concatted = pd .concat ([df , df ], keys = [0.8 , 0.5 ])
2547
+ result = concatted .sort_index ()
2548
+
2549
+ # this will be monotonic, but not lexsorted!
2550
+ assert not result .index .is_lexsorted ()
2551
+ assert result .index .is_monotonic
2552
+
2553
+ tm .assert_frame_equal (result , expected )
2554
+
2555
+ # 14015
2556
+ df = DataFrame ([[1 , 2 ], [6 , 7 ]],
2557
+ columns = MultiIndex .from_tuples (
2558
+ [(0 , '20160811 12:00:00' ),
2559
+ (0 , '20160809 12:00:00' )],
2560
+ names = ['l1' , 'Date' ]))
2561
+
2562
+ df .columns .set_levels (pd .to_datetime (df .columns .levels [1 ]),
2563
+ level = 1 ,
2564
+ inplace = True )
2565
+ assert not df .columns .is_lexsorted ()
2566
+ assert not df .columns .is_monotonic
2567
+ result = df .sort_index (axis = 1 )
2568
+ assert result .columns .is_lexsorted ()
2569
+ assert result .columns .is_monotonic
2570
+ result = df .sort_index (axis = 1 , level = 1 )
2571
+ assert result .columns .is_lexsorted ()
2572
+ assert result .columns .is_monotonic
2573
+
2574
+ def test_sort_index_reorder_on_ops (self ):
2575
+ # 15687
2576
+ df = pd .DataFrame (
2577
+ np .random .randn (8 , 2 ),
2578
+ index = MultiIndex .from_product (
2579
+ [['a' , 'b' ],
2580
+ ['big' , 'small' ],
2581
+ ['red' , 'blu' ]],
2582
+ names = ['letter' , 'size' , 'color' ]),
2583
+ columns = ['near' , 'far' ])
2584
+ df = df .sort_index ()
2585
+
2586
+ def my_func (group ):
2587
+ group .index = ['newz' , 'newa' ]
2588
+ return group
2589
+
2590
+ result = df .groupby (level = ['letter' , 'size' ]).apply (
2591
+ my_func ).sort_index ()
2592
+ expected = MultiIndex .from_product (
2593
+ [['a' , 'b' ],
2594
+ ['big' , 'small' ],
2595
+ ['newa' , 'newz' ]],
2596
+ names = ['letter' , 'size' , None ])
2597
+
2598
+ tm .assert_index_equal (result .index , expected )
0 commit comments