@@ -117,6 +117,12 @@ def __init__(
117
117
self ._display_funcs : DefaultDict [ # maps (row, col) -> format func
118
118
tuple [int , int ], Callable [[Any ], str ]
119
119
] = defaultdict (lambda : partial (_default_formatter , precision = precision ))
120
+ self ._display_funcs_index : DefaultDict [ # maps (row, level) -> format func
121
+ tuple [int , int ], Callable [[Any ], str ]
122
+ ] = defaultdict (lambda : partial (_default_formatter , precision = precision ))
123
+ self ._display_funcs_columns : DefaultDict [ # maps (level, col) -> format func
124
+ tuple [int , int ], Callable [[Any ], str ]
125
+ ] = defaultdict (lambda : partial (_default_formatter , precision = precision ))
120
126
121
127
def _render_html (
122
128
self ,
@@ -377,6 +383,7 @@ def _translate_header(
377
383
f"{ col_heading_class } level{ r } col{ c } " ,
378
384
value ,
379
385
_is_visible (c , r , col_lengths ),
386
+ display_value = self ._display_funcs_columns [(r , c )](value ),
380
387
attributes = (
381
388
f'colspan="{ col_lengths .get ((r , c ), 0 )} "'
382
389
if col_lengths .get ((r , c ), 0 ) > 1
@@ -535,6 +542,7 @@ def _translate_body(
535
542
f"{ row_heading_class } level{ c } row{ r } " ,
536
543
value ,
537
544
_is_visible (r , c , idx_lengths ) and not self .hide_index_ [c ],
545
+ display_value = self ._display_funcs_index [(r , c )](value ),
538
546
attributes = (
539
547
f'rowspan="{ idx_lengths .get ((c , r ), 0 )} "'
540
548
if idx_lengths .get ((c , r ), 0 ) > 1
@@ -834,6 +842,96 @@ def format(
834
842
835
843
return self
836
844
845
+ def format_index (
846
+ self ,
847
+ formatter : ExtFormatter | None = None ,
848
+ axis : int | str = 0 ,
849
+ level : Level | list [Level ] | None = None ,
850
+ na_rep : str | None = None ,
851
+ precision : int | None = None ,
852
+ decimal : str = "." ,
853
+ thousands : str | None = None ,
854
+ escape : str | None = None ,
855
+ ) -> StylerRenderer :
856
+ r"""
857
+ Format the text display value of index labels or column headers.
858
+
859
+ .. versionadded:: 1.4.0
860
+
861
+ Parameters
862
+ ----------
863
+ formatter : str, callable, dict or None
864
+ Object to define how values are displayed. See notes.
865
+ axis : {0, "index", 1, "columns"}
866
+ Whether to apply the formatter to the index or column headers.
867
+ level : int, str, list
868
+ The level(s) over which to apply the generic formatter.
869
+ na_rep : str, optional
870
+ Representation for missing values.
871
+ If ``na_rep`` is None, no special formatting is applied.
872
+ precision : int, optional
873
+ Floating point precision to use for display purposes, if not determined by
874
+ the specified ``formatter``.
875
+ decimal : str, default "."
876
+ Character used as decimal separator for floats, complex and integers
877
+ thousands : str, optional, default None
878
+ Character used as thousands separator for floats, complex and integers
879
+ escape : str, optional
880
+ Use 'html' to replace the characters ``&``, ``<``, ``>``, ``'``, and ``"``
881
+ in cell display string with HTML-safe sequences.
882
+ Use 'latex' to replace the characters ``&``, ``%``, ``$``, ``#``, ``_``,
883
+ ``{``, ``}``, ``~``, ``^``, and ``\`` in the cell display string with
884
+ LaTeX-safe sequences.
885
+ Escaping is done before ``formatter``.
886
+
887
+ Returns
888
+ -------
889
+ self : Styler
890
+ """
891
+ axis = self .data ._get_axis_number (axis )
892
+ if axis == 0 :
893
+ display_funcs_ , obj = self ._display_funcs_index , self .index
894
+ else :
895
+ display_funcs_ , obj = self ._display_funcs_columns , self .columns
896
+ levels_ = refactor_levels (level , obj )
897
+
898
+ if all (
899
+ (
900
+ formatter is None ,
901
+ level is None ,
902
+ precision is None ,
903
+ decimal == "." ,
904
+ thousands is None ,
905
+ na_rep is None ,
906
+ escape is None ,
907
+ )
908
+ ):
909
+ display_funcs_ .clear ()
910
+ return self # clear the formatter / revert to default and avoid looping
911
+
912
+ if not isinstance (formatter , dict ):
913
+ formatter = {level : formatter for level in levels_ }
914
+ else :
915
+ formatter = {
916
+ obj ._get_level_number (level ): formatter_
917
+ for level , formatter_ in formatter .items ()
918
+ }
919
+
920
+ for lvl in levels_ :
921
+ format_func = _maybe_wrap_formatter (
922
+ formatter .get (lvl ),
923
+ na_rep = na_rep ,
924
+ precision = precision ,
925
+ decimal = decimal ,
926
+ thousands = thousands ,
927
+ escape = escape ,
928
+ )
929
+
930
+ for idx in [(i , lvl ) if axis == 0 else (lvl , i ) for i in range (len (obj ))]:
931
+ display_funcs_ [idx ] = format_func
932
+
933
+ return self
934
+
837
935
838
936
def _element (
839
937
html_element : str ,
0 commit comments