@@ -513,12 +513,23 @@ def get_col_type(dtype):
513
513
else :
514
514
strcols = self ._to_str_columns ()
515
515
516
+ if self .index and isinstance (self .frame .index , MultiIndex ):
517
+ fmt = self ._get_formatter ('__index__' )
518
+ clevels = self .frame .columns .nlevels
519
+ strcols .pop (0 )
520
+ name = any (self .frame .columns .names )
521
+ for i , lev in enumerate (self .frame .index .levels ):
522
+ lev2 = lev .format (name = name )
523
+ width = len (lev2 [0 ])
524
+ lev3 = [' ' * width ] * clevels + lev2
525
+ strcols .insert (i , lev3 )
526
+
516
527
if column_format is None :
517
528
dtypes = self .frame .dtypes .values
529
+ column_format = '' .join (map (get_col_type , dtypes ))
518
530
if self .index :
519
- column_format = 'l%s' % '' .join (map (get_col_type , dtypes ))
520
- else :
521
- column_format = '%s' % '' .join (map (get_col_type , dtypes ))
531
+ index_format = 'l' * self .frame .index .nlevels
532
+ column_format = index_format + column_format
522
533
elif not isinstance (column_format ,
523
534
compat .string_types ): # pragma: no cover
524
535
raise AssertionError ('column_format must be str or unicode, not %s'
@@ -645,8 +656,8 @@ def has_index_names(self):
645
656
def has_column_names (self ):
646
657
return _has_names (self .frame .columns )
647
658
648
- def _get_formatted_index (self ,frame ):
649
- # Note: this is only used by to_string(), not by to_html().
659
+ def _get_formatted_index (self , frame ):
660
+ # Note: this is only used by to_string() and to_latex() , not by to_html().
650
661
index = frame .index
651
662
columns = frame .columns
652
663
0 commit comments