逐行为pandas DataFrame应用样式

7

我正在使用一个包含客户信息的数据集来学习Python技术。

下面是DataFrame结构(这些是虚构的记录):

import pandas as pd

df1 = pd.DataFrame({'left_name' : ['James', 'Mary', 'John', 'Patricia'],
                    'left_age' : [30, 37, 30, 35], 
                    'right_name' : ['Robert', 'Jennifer', 'Michael', 'Linda'], 
                    'right_age' : [30, 31, 38, 35]})
print(df1)

  left_name  left_age right_name  right_age
0     James        30     Robert         30
1      Mary        37   Jennifer         31
2      John        30    Michael         38
3  Patricia        35      Linda         35

应用transpose方法到df1,我们得到以下视图:
df2 = df1.T
print(df2)

                 0         1        2         3
left_name    James      Mary     John  Patricia
left_age        30        37       30        35
right_name  Robert  Jennifer  Michael     Linda
right_age       30        31       38        35

我的目标是对df2应用一些样式。特别地,

  • left_nameright_name行应该被突出显示为黄色;
  • left_ageright_age行应该被突出显示为蓝色。

在发帖之前,我做了一些研究,成功地突出显示了一个子集:

df2.style.set_properties(subset = pd.IndexSlice[['left_name', 'right_name'], :], **{'background-color' : 'yellow'})

enter image description here

问题是我无法将多个样式组合在一起。如果我尝试使用与上面相同的方法为left_ageright_age添加额外的蓝色颜色,将会“丢失”之前的样式。

理想情况下,我希望有一个函数,它以df2作为输入并返回样式化的DataFrame。

3个回答

7
你离成功很近了!你实际上可以在同一个数据框上“链式”使用set_properties方法:
df2.style.set_properties(subset = pd.IndexSlice[['left_name','right_name'], :], **{'background-color' : 'yellow'})\
.set_properties(subset = pd.IndexSlice[['left_age','right_age'], :], **{'background-color' : 'blue'})

enter image description here

我相信有更优雅的解决方案,但这个方法可行!

(注:此文涉及IT技术)


真的很接近了!我稍微倾向于 jezrael 的解决方案,但我也投了你的赞。 - glpsx
2
@VonKar,就我个人而言...我也偏爱他的解决方案哈哈 - MattR

6
你可以使用Styler.apply创建样式的DataFrame,并使用loc按索引值设置行:
def highlight(x):
    c1 = 'background-color: yellow'
    c2 = 'background-color: blue'

    df1 = pd.DataFrame('', index=x.index, columns=x.columns)
    df1.loc[['left_name','right_name'], :] = c1
    df1.loc[['left_age','right_age'], :] = c2
    return df1

df1.T.style.apply(highlight, axis=None)

2
我知道一定有更好的方法。你总是教给我新东西! - MattR
1
如果我执行上述操作,会收到以下错误:AttributeError: 'Styler' 对象没有属性 'T'。 - Philippe
@Philippe 将其更改为 df1.T.style.apply(highlight, axis=None) - Marcelo Gazzola

1

接着MattR的回答:不必用链式,可以将结果分配给第一次调用set_properties的样式化器,并再次调用set_properties - 选择行的方式略有不同:

s1 = df1.T.style.set_properties(**{'background-color': 'yellow'}, subset=(['left_name', 'right_name'], slice(None)))
s1 = s1.set_properties(**{'background-color': 'blue'}, subset=(['left_age', 'right_age'], slice(None)))
s1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接