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