Skip to content

Commit a68d28c

Browse files
authored
CLN: make cell_context DefaultDict like ctx - simplify code (#40453)
1 parent f841eda commit a68d28c

File tree

2 files changed

+28
-29
lines changed

2 files changed

+28
-29
lines changed

asv_bench/benchmarks/io/style.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from pandas import DataFrame
44

55

6-
class RenderApply:
6+
class Render:
77

88
params = [[12, 24, 36], [12, 120]]
99
param_names = ["cols", "rows"]
@@ -14,15 +14,21 @@ def setup(self, cols, rows):
1414
columns=[f"float_{i+1}" for i in range(cols)],
1515
index=[f"row_{i+1}" for i in range(rows)],
1616
)
17-
self._style_apply()
1817

19-
def time_render(self, cols, rows):
18+
def time_apply_render(self, cols, rows):
19+
self._style_apply()
2020
self.st.render()
2121

22-
def peakmem_apply(self, cols, rows):
22+
def peakmem_apply_render(self, cols, rows):
2323
self._style_apply()
24+
self.st.render()
2425

25-
def peakmem_render(self, cols, rows):
26+
def time_classes_render(self, cols, rows):
27+
self._style_classes()
28+
self.st.render()
29+
30+
def peakmem_classes_render(self, cols, rows):
31+
self._style_classes()
2632
self.st.render()
2733

2834
def _style_apply(self):
@@ -32,3 +38,8 @@ def _apply_func(s):
3238
]
3339

3440
self.st = self.df.style.apply(_apply_func, axis=1)
41+
42+
def _style_classes(self):
43+
classes = self.df.applymap(lambda v: ("cls-1" if v > 0 else ""))
44+
classes.index, classes.columns = self.df.index, self.df.columns
45+
self.st = self.df.style.set_td_classes(classes)

pandas/io/formats/style.py

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ def __init__(
193193
self.hidden_index: bool = False
194194
self.hidden_columns: Sequence[int] = []
195195
self.ctx: DefaultDict[Tuple[int, int], CSSList] = defaultdict(list)
196-
self.cell_context: Dict[str, Any] = {}
196+
self.cell_context: DefaultDict[Tuple[int, int], str] = defaultdict(str)
197197
self._todo: List[Tuple[Callable, Tuple, Dict]] = []
198198
self.tooltips: Optional[_Tooltips] = None
199199
def_precision = get_option("display.precision")
@@ -420,19 +420,11 @@ def _translate(self):
420420

421421
if clabels:
422422
for c, value in enumerate(clabels[r]):
423-
cs = [
424-
COL_HEADING_CLASS,
425-
f"level{r}",
426-
f"col{c}",
427-
]
428-
cs.extend(
429-
cell_context.get("col_headings", {}).get(r, {}).get(c, [])
430-
)
431423
es = {
432424
"type": "th",
433425
"value": value,
434426
"display_value": value,
435-
"class": " ".join(cs),
427+
"class": f"{COL_HEADING_CLASS} level{r} col{c}",
436428
"is_visible": _is_visible(c, r, col_lengths),
437429
}
438430
colspan = col_lengths.get((r, c), 0)
@@ -492,7 +484,6 @@ def _translate(self):
492484
row_es.append(es)
493485

494486
for c, value in enumerate(row_tup[1:]):
495-
cs = [DATA_CLASS, f"row{r}", f"col{c}"]
496487
formatter = self._display_funcs[(r, c)]
497488
row_dict = {
498489
"type": "td",
@@ -505,12 +496,14 @@ def _translate(self):
505496
# only add an id if the cell has a style
506497
props: CSSList = []
507498
if self.cell_ids or (r, c) in ctx:
508-
row_dict["id"] = "_".join(cs[1:])
499+
row_dict["id"] = f"row{r}_col{c}"
509500
props.extend(ctx[r, c])
510501

511502
# add custom classes from cell context
512-
cs.extend(cell_context.get("data", {}).get(r, {}).get(c, []))
513-
row_dict["class"] = " ".join(cs)
503+
cls = ""
504+
if (r, c) in cell_context:
505+
cls = " " + cell_context[r, c]
506+
row_dict["class"] = f"{DATA_CLASS} row{r} col{c}{cls}"
514507

515508
row_es.append(row_dict)
516509
if props: # (), [] won't be in cellstyle_map, cellstyle respectively
@@ -736,15 +729,10 @@ def set_td_classes(self, classes: DataFrame) -> Styler:
736729
"""
737730
classes = classes.reindex_like(self.data)
738731

739-
mask = (classes.isna()) | (classes.eq(""))
740-
self.cell_context["data"] = {
741-
r: {
742-
c: [str(classes.iloc[r, c])]
743-
for c, cn in enumerate(classes.columns)
744-
if not mask.iloc[r, c]
745-
}
746-
for r, rn in enumerate(classes.index)
747-
}
732+
for r, row_tup in enumerate(classes.itertuples()):
733+
for c, value in enumerate(row_tup[1:]):
734+
if not (pd.isna(value) or value == ""):
735+
self.cell_context[(r, c)] = str(value)
748736

749737
return self
750738

@@ -859,7 +847,7 @@ def clear(self) -> None:
859847
"""
860848
self.ctx.clear()
861849
self.tooltips = None
862-
self.cell_context = {}
850+
self.cell_context.clear()
863851
self._todo = []
864852

865853
def _compute(self):

0 commit comments

Comments
 (0)