@@ -780,6 +780,7 @@ def write_result(self, buf):
780
780
781
781
def _write_header (self , indent ):
782
782
truncate_h = self .fmt .truncate_h
783
+ row_levels = self .frame .index .nlevels
783
784
if not self .fmt .header :
784
785
# write nothing
785
786
return indent
@@ -819,13 +820,49 @@ def _column_header():
819
820
sentinel = None
820
821
levels = self .columns .format (sparsify = sentinel ,
821
822
adjoin = False , names = False )
822
-
823
823
level_lengths = _get_level_lengths (levels , sentinel )
824
-
825
- row_levels = self .frame .index .nlevels
826
-
824
+ inner_lvl = len (level_lengths ) - 1
827
825
for lnum , (records , values ) in enumerate (zip (level_lengths ,
828
826
levels )):
827
+ if truncate_h :
828
+ # modify the header lines
829
+ ins_col = self .fmt .tr_col_num
830
+ if self .fmt .sparsify :
831
+ recs_new = {}
832
+ # Increment tags after ... col.
833
+ for tag ,span in list (records .items ()):
834
+ if tag >= ins_col :
835
+ recs_new [tag + 1 ] = span
836
+ elif tag + span > ins_col :
837
+ recs_new [tag ] = span + 1
838
+ if lnum == inner_lvl :
839
+ values = values [:ins_col ] + (u ('...' ),) + \
840
+ values [ins_col :]
841
+ else : # sparse col headers do not receive a ...
842
+ values = values [:ins_col ] + \
843
+ (values [ins_col - 1 ],) + values [ins_col :]
844
+ else :
845
+ recs_new [tag ] = span
846
+ # if ins_col lies between tags, all col headers get ...
847
+ if tag + span == ins_col :
848
+ recs_new [ins_col ] = 1
849
+ values = values [:ins_col ] + (u ('...' ),) + \
850
+ values [ins_col :]
851
+ records = recs_new
852
+ inner_lvl = len (level_lengths ) - 1
853
+ if lnum == inner_lvl :
854
+ records [ins_col ] = 1
855
+ else :
856
+ recs_new = {}
857
+ for tag ,span in list (records .items ()):
858
+ if tag >= ins_col :
859
+ recs_new [tag + 1 ] = span
860
+ else :
861
+ recs_new [tag ] = span
862
+ recs_new [ins_col ] = 1
863
+ records = recs_new
864
+ values = values [:ins_col ] + [u ('...' )] + values [ins_col :]
865
+
829
866
name = self .columns .names [lnum ]
830
867
row = ['' ] * (row_levels - 1 ) + ['' if name is None
831
868
else com .pprint_thing (name )]
@@ -839,25 +876,15 @@ def _column_header():
839
876
continue
840
877
j += 1
841
878
row .append (v )
842
- if truncate_h :
843
- if self .fmt .sparsify and lnum == 0 :
844
- ins_col = row_levels + self .fmt .tr_col_num - 1
845
- row .insert (ins_col , '...' )
846
-
847
- for tag in list (tags .keys ()):
848
- if tag >= ins_col :
849
- tags [tag + 1 ] = tags .pop (tag )
850
- else :
851
- row .insert (row_levels + self .fmt .tr_col_num , '...' )
852
-
853
879
self .write_tr (row , indent , self .indent_delta , tags = tags ,
854
880
header = True )
855
881
else :
856
882
col_row = _column_header ()
857
883
align = self .fmt .justify
858
884
859
885
if truncate_h :
860
- col_row .insert (self .fmt .tr_col_num + 1 , '...' )
886
+ ins_col = row_levels + self .fmt .tr_col_num
887
+ col_row .insert (ins_col , '...' )
861
888
862
889
self .write_tr (col_row , indent , self .indent_delta , header = True ,
863
890
align = align )
@@ -866,6 +893,9 @@ def _column_header():
866
893
row = [
867
894
x if x is not None else '' for x in self .frame .index .names
868
895
] + ['' ] * min (len (self .columns ), self .max_cols )
896
+ if truncate_h :
897
+ ins_col = row_levels + self .fmt .tr_col_num
898
+ row .insert (ins_col , '' )
869
899
self .write_tr (row , indent , self .indent_delta , header = True )
870
900
871
901
indent -= self .indent_delta
@@ -948,12 +978,36 @@ def _write_hierarchical_rows(self, fmt_values, indent):
948
978
adjoin = False , names = False )
949
979
950
980
level_lengths = _get_level_lengths (levels , sentinel )
981
+ inner_lvl = len (level_lengths ) - 1
982
+ if truncate_v :
983
+ # Insert ... row and adjust idx_values and
984
+ # level_lengths to take this into account.
985
+ ins_row = self .fmt .tr_row_num
986
+ for lnum ,records in enumerate (level_lengths ):
987
+ rec_new = {}
988
+ for tag ,span in list (records .items ()):
989
+ if tag >= ins_row :
990
+ rec_new [tag + 1 ] = span
991
+ elif tag + span > ins_row :
992
+ rec_new [tag ] = span + 1
993
+ dot_row = list (idx_values [ins_row - 1 ])
994
+ dot_row [- 1 ] = u ('...' )
995
+ idx_values .insert (ins_row ,tuple (dot_row ))
996
+ else :
997
+ rec_new [tag ] = span
998
+ # If ins_row lies between tags, all cols idx cols receive ...
999
+ if tag + span == ins_row :
1000
+ rec_new [ins_row ] = 1
1001
+ if lnum == 0 :
1002
+ idx_values .insert (ins_row ,tuple ([u ('...' )]* len (level_lengths )))
1003
+ level_lengths [lnum ] = rec_new
1004
+
1005
+ level_lengths [inner_lvl ][ins_row ] = 1
1006
+ for ix_col in range (len (fmt_values )):
1007
+ fmt_values [ix_col ].insert (ins_row ,'...' )
1008
+ nrows += 1
951
1009
952
1010
for i in range (nrows ):
953
- if truncate_v and i == (self .fmt .tr_row_num ):
954
- str_sep_row = [ '...' ] * (len (row ) + sparse_offset )
955
- self .write_tr (str_sep_row , indent , self .indent_delta , tags = None )
956
-
957
1011
row = []
958
1012
tags = {}
959
1013
0 commit comments