将样式应用于 pandas DataFrame 行

glp*_*psx 7 python formatting dataframe pandas pandas-styles

我正在使用包含客户信息的数据集实验/学习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
Run Code Online (Sandbox Code Playgroud)

将该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
Run Code Online (Sandbox Code Playgroud)

我的目标是应用一些样式df2。具体来说,

  • 和行应以黄色突出显示left_nameright_name
  • 和行应以蓝色突出显示left_ageright_age

在在这里发帖之前我做了一些研究,并设法通过以下方式突出显示一个子集:

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

在此输入图像描述

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

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

Mat*_*ttR 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'})
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我确信有一个更优雅的解决方案 - 但这是可行的!

  • @VonKar,无论它的价值...我也更喜欢他的解决方案哈哈 (2认同)

jez*_*ael 6

您可以使用以下命令创建样式的 DataFrame 并按Styler.apply索引值设置行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)
Run Code Online (Sandbox Code Playgroud)

  • 我知道一定有更好的方法。你总是教我一些东西! (2认同)