Skip to content

Commit 4bf7538

Browse files
authored
REF: refactor_levels for Styler.format_index (#43537)
1 parent a54aa39 commit 4bf7538

File tree

2 files changed

+40
-39
lines changed

2 files changed

+40
-39
lines changed

pandas/io/formats/style.py

+4-38
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
import pandas as pd
3434
from pandas import (
35-
Index,
3635
IndexSlice,
3736
RangeIndex,
3837
)
@@ -58,6 +57,7 @@
5857
Tooltips,
5958
maybe_convert_css_to_tuples,
6059
non_reducing_slice,
60+
refactor_levels,
6161
)
6262

6363
try:
@@ -1388,7 +1388,7 @@ def _apply_index(
13881388
axis = self.data._get_axis_number(axis)
13891389
obj = self.index if axis == 0 else self.columns
13901390

1391-
levels_ = _refactor_levels(level, obj)
1391+
levels_ = refactor_levels(level, obj)
13921392
data = DataFrame(obj.to_list()).loc[:, levels_]
13931393

13941394
if method == "apply":
@@ -2206,7 +2206,7 @@ def hide_index(
22062206
self.hide_index_names = True
22072207
return self
22082208

2209-
levels_ = _refactor_levels(level, self.index)
2209+
levels_ = refactor_levels(level, self.index)
22102210
self.hide_index_ = [
22112211
True if lev in levels_ else False for lev in range(self.index.nlevels)
22122212
]
@@ -2345,7 +2345,7 @@ def hide_columns(
23452345
self.hide_column_names = True
23462346
return self
23472347

2348-
levels_ = _refactor_levels(level, self.columns)
2348+
levels_ = refactor_levels(level, self.columns)
23492349
self.hide_columns_ = [
23502350
True if lev in levels_ else False for lev in range(self.columns.nlevels)
23512351
]
@@ -3532,37 +3532,3 @@ def css_calc(x, left: float, right: float, align: str):
35323532
index=data.index,
35333533
columns=data.columns,
35343534
)
3535-
3536-
3537-
def _refactor_levels(
3538-
level: Level | list[Level] | None,
3539-
obj: Index,
3540-
) -> list[Level]:
3541-
"""
3542-
Returns a consistent levels arg for use in ``hide_index`` or ``hide_columns``.
3543-
3544-
Parameters
3545-
----------
3546-
level : int, str, list
3547-
Original ``level`` arg supplied to above methods.
3548-
obj:
3549-
Either ``self.index`` or ``self.columns``
3550-
3551-
Returns
3552-
-------
3553-
list : refactored arg with a list of levels to hide
3554-
"""
3555-
if level is None:
3556-
levels_: list[Level] = list(range(obj.nlevels))
3557-
elif isinstance(level, int):
3558-
levels_ = [level]
3559-
elif isinstance(level, str):
3560-
levels_ = [obj._get_level_number(level)]
3561-
elif isinstance(level, list):
3562-
levels_ = [
3563-
obj._get_level_number(lev) if not isinstance(lev, int) else lev
3564-
for lev in level
3565-
]
3566-
else:
3567-
raise ValueError("`level` must be of type `int`, `str` or list of such")
3568-
return levels_

pandas/io/formats/style_render.py

+36-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from pandas._config import get_option
2323

2424
from pandas._libs import lib
25+
from pandas._typing import Level
2526
from pandas.compat._optional import import_optional_dependency
2627

2728
from pandas.core.dtypes.generic import ABCSeries
@@ -113,7 +114,7 @@ def __init__(
113114
precision = (
114115
get_option("styler.format.precision") if precision is None else precision
115116
)
116-
self._display_funcs: DefaultDict[ # maps (row, col) -> formatting function
117+
self._display_funcs: DefaultDict[ # maps (row, col) -> format func
117118
tuple[int, int], Callable[[Any], str]
118119
] = defaultdict(lambda: partial(_default_formatter, precision=precision))
119120

@@ -1172,6 +1173,40 @@ def maybe_convert_css_to_tuples(style: CSSProperties) -> CSSList:
11721173
return style
11731174

11741175

1176+
def refactor_levels(
1177+
level: Level | list[Level] | None,
1178+
obj: Index,
1179+
) -> list[int]:
1180+
"""
1181+
Returns a consistent levels arg for use in ``hide_index`` or ``hide_columns``.
1182+
1183+
Parameters
1184+
----------
1185+
level : int, str, list
1186+
Original ``level`` arg supplied to above methods.
1187+
obj:
1188+
Either ``self.index`` or ``self.columns``
1189+
1190+
Returns
1191+
-------
1192+
list : refactored arg with a list of levels to hide
1193+
"""
1194+
if level is None:
1195+
levels_: list[int] = list(range(obj.nlevels))
1196+
elif isinstance(level, int):
1197+
levels_ = [level]
1198+
elif isinstance(level, str):
1199+
levels_ = [obj._get_level_number(level)]
1200+
elif isinstance(level, list):
1201+
levels_ = [
1202+
obj._get_level_number(lev) if not isinstance(lev, int) else lev
1203+
for lev in level
1204+
]
1205+
else:
1206+
raise ValueError("`level` must be of type `int`, `str` or list of such")
1207+
return levels_
1208+
1209+
11751210
class Tooltips:
11761211
"""
11771212
An extension to ``Styler`` that allows for and manipulates tooltips on hover

0 commit comments

Comments
 (0)