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

如何使用Pandas style.Styler按行格式化数据值?

需求:为指定行设置百分比格式,其余行按需设置整数/百分比格式

下述代码生成了一个DataFrame(DF)并应用了一些基础样式(边框、修改背景色、文本居中等)。
我需要将索引为'KPI DEF'的行中所有值格式化为百分比,部分行需设为整数格式,部分设为百分比格式。


已探索的方案说明

  • 已使用Pandas的style.Styler.format方法将目标列设为百分比,但该方法无法指定轴。
  • 尝试过style.Styler.apply方法,想对目标行应用函数(类似常规DF的apply),但文档显示该方法仅用于HTML/CSS样式。

import pandas as pd

df = pd.DataFrame(index=pd.Index(['KPI ABC', 'KPI DEF', 'KPI GHI', 'KPI JKL']),
                  columns=pd.MultiIndex.from_product([
                      ['North America', 'Europe', 'Asia'],
                      ['Weekly', 'Monthly'],
                      ['WK-01', 'WK-02', 'WK-03', 'WK-04', 'WK-05', 'WoW', 'Jan', 'Feb', 'Mar', 'MoM']]))


df.at['KPI ABC', ('North America', 'Weekly', 'WoW')] = 1.44
df.at['KPI ABC', ('Europe', 'Monthly', 'MoM')] = -0.24
df.at['KPI ABC', ('Asia', 'Monthly', 'MoM')] = 0

df.at['KPI DEF', ('North America', 'Weekly', 'WK-01')] = 91.21
df.at['KPI DEF', ('North America', 'Weekly', 'WK-02')] = 91.26
df.at['KPI DEF', ('North America', 'Weekly', 'WK-03')] = 90.77
df.at['KPI DEF', ('North America', 'Weekly', 'WK-04')] = 91.16
df.at['KPI DEF', ('North America', 'Weekly', 'WK-05')] = 91.37


mapper =  {('North America', 'Weekly', 'WoW'): '{0:.2f}%',
           ('Europe', 'Monthly', 'MoM'): '{0:.2f}%',
           ('Asia', 'Monthly', 'MoM'): '{0:.2f}%'}

s = df.style.format(mapper).hide([
    ('North America', 'Weekly', 'Jan'),
    ('North America', 'Weekly', 'Feb'),
    ('North America', 'Weekly', 'Mar'),
    ('North America', 'Weekly', 'MoM'),
    ('North America', 'Monthly', 'WK-01'),
    ('North America', 'Monthly', 'WK-02'),
    ('North America', 'Monthly', 'WK-03'),
    ('North America', 'Monthly', 'WK-04'),
    ('North America', 'Monthly', 'WK-05'),
    ('North America', 'Monthly', 'WoW'),

    ('Europe', 'Weekly', 'Jan'),
    ('Europe', 'Weekly', 'Feb'),
    ('Europe', 'Weekly', 'Mar'),
    ('Europe', 'Weekly', 'MoM'),
    ('Europe', 'Monthly', 'WK-01'),
    ('Europe', 'Monthly', 'WK-02'),
    ('Europe', 'Monthly', 'WK-03'),
    ('Europe', 'Monthly', 'WK-04'),
    ('Europe', 'Monthly', 'WK-05'),
    ('Europe', 'Monthly', 'WoW'),

    ('Asia', 'Weekly', 'Jan'),
    ('Asia', 'Weekly', 'Feb'),
    ('Asia', 'Weekly', 'Mar'),
    ('Asia', 'Weekly', 'MoM'),
    ('Asia', 'Monthly', 'WK-01'),
    ('Asia', 'Monthly', 'WK-02'),
    ('Asia', 'Monthly', 'WK-03'),
    ('Asia', 'Monthly', 'WK-04'),
    ('Asia', 'Monthly', 'WK-05'),
    ('Asia', 'Monthly', 'WoW')],
    axis="columns")

cell_hover = {'selector': 'td:hover', 'props': [('background-color', '#ffffb3')]}
headers = {'selector': 'th:not(.index_name)', 'props': 'background-color: #000066; color: white;'}
global_left_align = {'selector': 'th', 'props': 'text-align: left'}

s = s.set_table_styles([cell_hover, headers, global_left_align])


# BORDER FORMATTING ===========================
border_styles = {
    ('North America', 'Weekly', 'WoW'): {'selector': 'th, td', 'props': 'border-left: 1px solid #000066; border-right: 1px solid #000066'},
    ('North America', 'Monthly', 'MoM'): {'selector': 'th, td', 'props': 'border-left: 1px solid #000066; border-right: 1px solid #000066'},
    ('Europe', 'Weekly', 'WoW'): {'selector': 'th, td', 'props': 'border-left: 1px solid #000066; border-right: 1px solid #000066'},
    ('Europe', 'Monthly', 'MoM'): {'selector': 'th, td', 'props': 'border-left: 1px solid #000066; border-right: 1px solid #000066'},
    ('Asia', 'Weekly', 'WoW'): {'selector': 'th, td', 'props': 'border-left: 1px solid #000066; border-right: 1px solid #000066'},
    ('Asia', 'Monthly', 'MoM'): {'selector': 'th, td', 'props': 'border-left: 1px solid #000066; border-right: 1px solid #000066'}
}

for key, value in border_styles.items():
    s = s.set_table_styles({key: [value]}, overwrite=False, axis=0)

# COLUMN HEADER FORMATTING ===========================
s = s.set_table_styles([{'selector': 'th.col_heading', 'props': 'text-align: center;'}], overwrite=False)

def larger_headers(val):
    if val in ['North America', 'Europe', 'Asia']:
        return 'font-size: 16pt'
    return ''

s = s.applymap_index(larger_headers, axis='columns', level=0)

表格样式效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:28:13