You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更优雅地为多层索引DataFrame的特定行设置样式?

问题:优雅格式化Pandas多层索引DataFrame的Total行样式

我有一个如下所示的pandas多层索引DataFrame:

Year                          2019                   2020               
Decision                   Applied Admitted     % Applied Admitted     %
Class         Residency                                                 
Freshmen      Resident      1143.0    918.0  80.3  1094.0   1003.0  91.7
              Non-Resident  1371.0   1048.0  76.4  1223.0   1090.0  89.1
              Total         2514.0   1966.0  78.2  2317.0   2093.0  90.3
Transfer      Resident       404.0    358.0  88.6   406.0    354.0  87.2
              Non-Resident   371.0    313.0  84.4   356.0    288.0  80.9
              Total          775.0    671.0  86.6   762.0    642.0  84.3
Grad/Postbacc Total          418.0    311.0  74.4   374.0    282.0  75.4
Grand         Total         3707.0   2948.0  79.5  3453.0   3017.0  87.4

需求:不依赖实际行号,将所有Total行(第3、6、7、8行)设置为斜体,并将Grand Total行(第8行)设置为粗体。

我当前的实现方式如下:

df_totals.style.apply(lambda x:["font-style: italic;"]*len(x),subset=((slice(None),"Total"),))\
               .applymap_index(lambda x:"font-style: italic;" if x in ("Grand","Total") else "")

效果展示

但这种写法不够优雅且难以维护,尤其是applymap_index的调用部分,请问是否有更流畅的实现方式?


优化方案

思路

将样式判断逻辑封装为命名函数,结合行索引的条件判断,一次性处理单元格和索引的样式;通过精准的条件定位目标行,让代码逻辑更清晰、易维护。

实现代码

def format_total_cells(row):
    # 判断当前行是否为Total行
    is_total_row = row.name[1] == "Total"
    # 判断是否为Grand Total行
    is_grand_total = row.name[0] == "Grand"
    
    # 基础样式:Total行设为斜体
    base_style = ["font-style: italic;"] * len(row)
    if is_grand_total:
        # Grand Total行额外添加粗体样式
        base_style = [s + " font-weight: bold;" for s in base_style]
    return base_style

def format_index_parts(index_tuple):
    style_list = []
    for part in index_tuple:
        style = ""
        if part in ("Total", "Grand"):
            style += "font-style: italic;"
        if part == "Grand":
            style += " font-weight: bold;"
        style_list.append(style)
    return style_list

# 链式调用,结构清晰
styled_df = (df_totals.style
             .apply(format_total_cells, axis=1)
             .apply_index(format_index_parts, axis=0))

优化点说明

  1. 逻辑封装为命名函数:把样式判断拆分到有明确语义的函数中,后续修改样式规则只需调整函数内部,可读性和可维护性大幅提升。
  2. 单元格样式一次性处理:通过apply按行遍历,同时判断Total行和Grand Total行,一次性返回对应样式,避免多次零散的apply调用。
  3. 索引样式统一处理:使用apply_index替代applymap_index,直接接收索引元组进行判断,逻辑更直观。
  4. 格式化链式调用:用括号包裹链式调用,避免换行反斜杠,符合Python代码风格规范。

内容的提问来源于stack exchange,提问作者Jakob Lovern

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:51:36