diff --git a/pandas/io/formats/style.py b/pandas/io/formats/style.py index c10ac07d452a8..ed142017a066b 100644 --- a/pandas/io/formats/style.py +++ b/pandas/io/formats/style.py @@ -32,7 +32,6 @@ import pandas as pd from pandas import ( - Index, IndexSlice, RangeIndex, ) @@ -58,6 +57,7 @@ Tooltips, maybe_convert_css_to_tuples, non_reducing_slice, + refactor_levels, ) try: @@ -1388,7 +1388,7 @@ def _apply_index( axis = self.data._get_axis_number(axis) obj = self.index if axis == 0 else self.columns - levels_ = _refactor_levels(level, obj) + levels_ = refactor_levels(level, obj) data = DataFrame(obj.to_list()).loc[:, levels_] if method == "apply": @@ -2206,7 +2206,7 @@ def hide_index( self.hide_index_names = True return self - levels_ = _refactor_levels(level, self.index) + levels_ = refactor_levels(level, self.index) self.hide_index_ = [ True if lev in levels_ else False for lev in range(self.index.nlevels) ] @@ -2345,7 +2345,7 @@ def hide_columns( self.hide_column_names = True return self - levels_ = _refactor_levels(level, self.columns) + levels_ = refactor_levels(level, self.columns) self.hide_columns_ = [ True if lev in levels_ else False for lev in range(self.columns.nlevels) ] @@ -3532,37 +3532,3 @@ def css_calc(x, left: float, right: float, align: str): index=data.index, columns=data.columns, ) - - -def _refactor_levels( - level: Level | list[Level] | None, - obj: Index, -) -> list[Level]: - """ - Returns a consistent levels arg for use in ``hide_index`` or ``hide_columns``. - - Parameters - ---------- - level : int, str, list - Original ``level`` arg supplied to above methods. - obj: - Either ``self.index`` or ``self.columns`` - - Returns - ------- - list : refactored arg with a list of levels to hide - """ - if level is None: - levels_: list[Level] = list(range(obj.nlevels)) - elif isinstance(level, int): - levels_ = [level] - elif isinstance(level, str): - levels_ = [obj._get_level_number(level)] - elif isinstance(level, list): - levels_ = [ - obj._get_level_number(lev) if not isinstance(lev, int) else lev - for lev in level - ] - else: - raise ValueError("`level` must be of type `int`, `str` or list of such") - return levels_ diff --git a/pandas/io/formats/style_render.py b/pandas/io/formats/style_render.py index e0f2e68306b40..a63396b5637bc 100644 --- a/pandas/io/formats/style_render.py +++ b/pandas/io/formats/style_render.py @@ -22,6 +22,7 @@ from pandas._config import get_option from pandas._libs import lib +from pandas._typing import Level from pandas.compat._optional import import_optional_dependency from pandas.core.dtypes.generic import ABCSeries @@ -113,7 +114,7 @@ def __init__( precision = ( get_option("styler.format.precision") if precision is None else precision ) - self._display_funcs: DefaultDict[ # maps (row, col) -> formatting function + self._display_funcs: DefaultDict[ # maps (row, col) -> format func tuple[int, int], Callable[[Any], str] ] = defaultdict(lambda: partial(_default_formatter, precision=precision)) @@ -1172,6 +1173,40 @@ def maybe_convert_css_to_tuples(style: CSSProperties) -> CSSList: return style +def refactor_levels( + level: Level | list[Level] | None, + obj: Index, +) -> list[int]: + """ + Returns a consistent levels arg for use in ``hide_index`` or ``hide_columns``. + + Parameters + ---------- + level : int, str, list + Original ``level`` arg supplied to above methods. + obj: + Either ``self.index`` or ``self.columns`` + + Returns + ------- + list : refactored arg with a list of levels to hide + """ + if level is None: + levels_: list[int] = list(range(obj.nlevels)) + elif isinstance(level, int): + levels_ = [level] + elif isinstance(level, str): + levels_ = [obj._get_level_number(level)] + elif isinstance(level, list): + levels_ = [ + obj._get_level_number(lev) if not isinstance(lev, int) else lev + for lev in level + ] + else: + raise ValueError("`level` must be of type `int`, `str` or list of such") + return levels_ + + class Tooltips: """ An extension to ``Styler`` that allows for and manipulates tooltips on hover