如何使用 style.applymap() 为数据框中的行着色?

How to colour rows in a dataframe using style.applymap()?

我想为 DataFrame 对象 df 中的 'Grand Total' 行和 'Total' 列着色,为此我尝试了以下操作:

import pandas as pd

# Function to set background highlight colour.
def bg_colour (val):
    colour = '#ffff00'
    return 'background-color: %s' % colour

df = pd.DataFrame({'Category': ['A','B','C','D','Grand Total'], 'Total': [1,2,3,4,10]})
t1 = df.style.applymap(bg_colour, subset = ['Total'])
dfT = df.T
dfT = dfT.style.applymap(bg_colour, subset = [4])
t1T = t1.T

但是,当编译器执行到代码的最后一行时,出现了以下错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-48-c0c380b9c518> in <module>
      12 dfT = dfT.style.applymap(bg_colour, subset = [4])
      13 display(dfT)
 ---> 14 t1T = t1.T
 
AttributeError: 'Styler' object has no attribute 'T'

据我了解,style.applymap() 将 DataFrame 隐式转换为 Styler 类型的对象,不能将其作为 DataFrame 进一步操作。

问题 1:如何对 DataFrame 对象的行和列进行着色?

问题2:Styler类型的对象如何转换为DataFrame类型的?

Style object returns 一个 HTML-formatted 字符串,所以我认为将其转换为数据框并不是一件容易的事。我将重写该函数,而不是 applymap,因为它采用 column/row 作为参数并使用 apply。像这样:

def bg_colour_col (col):
    colour = '#ffff00'
    return ['background-color: %s' % colour 
                if col.name=='Total' or i==4   # color column `Total` or row `4`
                else ''
             for i,x in col.iteritems()]

df.style.apply(bg_colour_col)

输出: