@@ -514,12 +514,23 @@ def get_col_type(dtype):
514514 else :
515515 strcols = self ._to_str_columns ()
516516
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+
517528 if column_format is None :
518529 dtypes = self .frame .dtypes .values
530+ column_format = '' .join (map (get_col_type , dtypes ))
519531 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
523534 elif not isinstance (column_format ,
524535 compat .string_types ): # pragma: no cover
525536 raise AssertionError ('column_format must be str or unicode, not %s'
@@ -646,8 +657,8 @@ def has_index_names(self):
646657 def has_column_names (self ):
647658 return _has_names (self .frame .columns )
648659
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().
651662 index = frame .index
652663 columns = frame .columns
653664
0 commit comments