@@ -513,12 +513,23 @@ def get_col_type(dtype):
513513 else :
514514 strcols = self ._to_str_columns ()
515515
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+
516527 if column_format is None :
517528 dtypes = self .frame .dtypes .values
529+ column_format = '' .join (map (get_col_type , dtypes ))
518530 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
522533 elif not isinstance (column_format ,
523534 compat .string_types ): # pragma: no cover
524535 raise AssertionError ('column_format must be str or unicode, not %s'
@@ -645,8 +656,8 @@ def has_index_names(self):
645656 def has_column_names (self ):
646657 return _has_names (self .frame .columns )
647658
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().
650661 index = frame .index
651662 columns = frame .columns
652663
0 commit comments