@@ -316,7 +316,7 @@ def _translate_header(self, sparsify_cols: bool, max_cols: int):
316
316
self .columns , sparsify_cols , max_cols , self .hidden_columns
317
317
)
318
318
319
- clabels = self .data .columns .tolist ()[: max_cols ] # slice to allow trimming
319
+ clabels = self .data .columns .tolist ()
320
320
if self .data .columns .nlevels == 1 :
321
321
clabels = [[x ] for x in clabels ]
322
322
clabels = list (zip (* clabels ))
@@ -339,7 +339,9 @@ def _translate_header(self, sparsify_cols: bool, max_cols: int):
339
339
and not all (self .hide_index_ )
340
340
and not self .hide_index_names
341
341
):
342
- index_names_row = self ._generate_index_names_row (clabels , max_cols )
342
+ index_names_row = self ._generate_index_names_row (
343
+ clabels , max_cols , col_lengths
344
+ )
343
345
head .append (index_names_row )
344
346
345
347
return head
@@ -389,9 +391,27 @@ def _generate_col_header_row(self, iter: tuple, max_cols: int, col_lengths: dict
389
391
)
390
392
]
391
393
392
- column_headers = []
394
+ column_headers , visible_col_count = [], 0
393
395
for c , value in enumerate (clabels [r ]):
394
396
header_element_visible = _is_visible (c , r , col_lengths )
397
+ if header_element_visible :
398
+ visible_col_count += col_lengths .get ((r , c ), 0 )
399
+ if visible_col_count > max_cols :
400
+ # add an extra column with `...` value to indicate trimming
401
+ column_headers .append (
402
+ _element (
403
+ "th" ,
404
+ (
405
+ f"{ self .css ['col_heading' ]} { self .css ['level' ]} { r } "
406
+ f"{ self .css ['col_trim' ]} "
407
+ ),
408
+ "..." ,
409
+ True ,
410
+ attributes = "" ,
411
+ )
412
+ )
413
+ break
414
+
395
415
header_element = _element (
396
416
"th" ,
397
417
(
@@ -422,23 +442,9 @@ def _generate_col_header_row(self, iter: tuple, max_cols: int, col_lengths: dict
422
442
423
443
column_headers .append (header_element )
424
444
425
- if len (self .data .columns ) > max_cols :
426
- # add an extra column with `...` value to indicate trimming
427
- column_headers .append (
428
- _element (
429
- "th" ,
430
- (
431
- f"{ self .css ['col_heading' ]} { self .css ['level' ]} { r } "
432
- f"{ self .css ['col_trim' ]} "
433
- ),
434
- "..." ,
435
- True ,
436
- attributes = "" ,
437
- )
438
- )
439
445
return index_blanks + column_name + column_headers
440
446
441
- def _generate_index_names_row (self , iter : tuple , max_cols ):
447
+ def _generate_index_names_row (self , iter : tuple , max_cols : int , col_lengths : dict ):
442
448
"""
443
449
Generate the row containing index names
444
450
@@ -470,22 +476,37 @@ def _generate_index_names_row(self, iter: tuple, max_cols):
470
476
for c , name in enumerate (self .data .index .names )
471
477
]
472
478
473
- if not clabels :
474
- blank_len = 0
475
- elif len (self .data .columns ) <= max_cols :
476
- blank_len = len (clabels [0 ])
477
- else :
478
- blank_len = len (clabels [0 ]) + 1 # to allow room for `...` trim col
479
+ column_blanks , visible_col_count = [], 0
480
+ if clabels :
481
+ last_level = self .columns .nlevels - 1 # use last level since never sparsed
482
+ for c , value in enumerate (clabels [last_level ]):
483
+ header_element_visible = _is_visible (c , last_level , col_lengths )
484
+ if header_element_visible :
485
+ visible_col_count += 1
486
+ if visible_col_count > max_cols :
487
+ column_blanks .append (
488
+ _element (
489
+ "th" ,
490
+ (
491
+ f"{ self .css ['blank' ]} { self .css ['col' ]} { c } "
492
+ f"{ self .css ['col_trim' ]} "
493
+ ),
494
+ self .css ["blank_value" ],
495
+ True ,
496
+ attributes = "" ,
497
+ )
498
+ )
499
+ break
500
+
501
+ column_blanks .append (
502
+ _element (
503
+ "th" ,
504
+ f"{ self .css ['blank' ]} { self .css ['col' ]} { c } " ,
505
+ self .css ["blank_value" ],
506
+ c not in self .hidden_columns ,
507
+ )
508
+ )
479
509
480
- column_blanks = [
481
- _element (
482
- "th" ,
483
- f"{ self .css ['blank' ]} { self .css ['col' ]} { c } " ,
484
- self .css ["blank_value" ],
485
- c not in self .hidden_columns ,
486
- )
487
- for c in range (blank_len )
488
- ]
489
510
return index_names + column_blanks
490
511
491
512
def _translate_body (self , sparsify_index : bool , max_rows : int , max_cols : int ):
@@ -561,31 +582,36 @@ def _generate_trimmed_row(self, max_cols: int) -> list:
561
582
for c in range (self .data .index .nlevels )
562
583
]
563
584
564
- data = [
565
- _element (
566
- "td" ,
567
- f"{ self .css ['data' ]} { self .css ['col' ]} { c } { self .css ['row_trim' ]} " ,
568
- "..." ,
569
- (c not in self .hidden_columns ),
570
- attributes = "" ,
571
- )
572
- for c in range (max_cols )
573
- ]
585
+ data , visible_col_count = [], 0
586
+ for c , _ in enumerate (self .columns ):
587
+ data_element_visible = c not in self .hidden_columns
588
+ if data_element_visible :
589
+ visible_col_count += 1
590
+ if visible_col_count > max_cols :
591
+ data .append (
592
+ _element (
593
+ "td" ,
594
+ (
595
+ f"{ self .css ['data' ]} { self .css ['row_trim' ]} "
596
+ f"{ self .css ['col_trim' ]} "
597
+ ),
598
+ "..." ,
599
+ True ,
600
+ attributes = "" ,
601
+ )
602
+ )
603
+ break
574
604
575
- if len (self .data .columns ) > max_cols :
576
- # columns are also trimmed so we add the final element
577
605
data .append (
578
606
_element (
579
607
"td" ,
580
- (
581
- f"{ self .css ['data' ]} { self .css ['row_trim' ]} "
582
- f"{ self .css ['col_trim' ]} "
583
- ),
608
+ f"{ self .css ['data' ]} { self .css ['col' ]} { c } { self .css ['row_trim' ]} " ,
584
609
"..." ,
585
- True ,
610
+ data_element_visible ,
586
611
attributes = "" ,
587
612
)
588
613
)
614
+
589
615
return index_headers + data
590
616
591
617
def _generate_body_row (
@@ -654,9 +680,14 @@ def _generate_body_row(
654
680
655
681
index_headers .append (header_element )
656
682
657
- data = []
683
+ data , visible_col_count = [], 0
658
684
for c , value in enumerate (row_tup [1 :]):
659
- if c >= max_cols :
685
+ data_element_visible = (
686
+ c not in self .hidden_columns and r not in self .hidden_rows
687
+ )
688
+ if data_element_visible :
689
+ visible_col_count += 1
690
+ if visible_col_count > max_cols :
660
691
data .append (
661
692
_element (
662
693
"td" ,
@@ -676,9 +707,6 @@ def _generate_body_row(
676
707
if (r , c ) in self .cell_context :
677
708
cls = " " + self .cell_context [r , c ]
678
709
679
- data_element_visible = (
680
- c not in self .hidden_columns and r not in self .hidden_rows
681
- )
682
710
data_element = _element (
683
711
"td" ,
684
712
(
@@ -1252,15 +1280,15 @@ def _get_level_lengths(
1252
1280
elif j not in hidden_elements :
1253
1281
# then element must be part of sparsified section and is visible
1254
1282
visible_row_count += 1
1283
+ if visible_row_count > max_index :
1284
+ break # do not add a length since the render trim limit reached
1255
1285
if lengths [(i , last_label )] == 0 :
1256
1286
# if previous iteration was first-of-section but hidden then offset
1257
1287
last_label = j
1258
1288
lengths [(i , last_label )] = 1
1259
1289
else :
1260
- # else add to previous iteration but do not extend more than max
1261
- lengths [(i , last_label )] = min (
1262
- max_index , 1 + lengths [(i , last_label )]
1263
- )
1290
+ # else add to previous iteration
1291
+ lengths [(i , last_label )] += 1
1264
1292
1265
1293
non_zero_lengths = {
1266
1294
element : length for element , length in lengths .items () if length >= 1
0 commit comments