【问题标题】:Applying style to a pandas DataFrame row-wise将样式逐行应用于 pandas DataFrame
【发布时间】:2019-12-25 17:11:34
【问题描述】:

我正在使用包含客户信息的数据集来试验/学习 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'})

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

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

【问题讨论】:

    标签: python pandas dataframe formatting pandas-styles


    【解决方案1】:

    您可以使用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.style.T.apply(highlight, axis=None)
    

    【讨论】:

    • 我知道一定有更好的方法。你总是在教我一些东西!
    • 如果我执行上述操作,我会收到错误消息:AttributeError: 'Styler' object has no attribute 'T'
    【解决方案2】:

    你离得太近了!您实际上可以在同一个数据帧上“链接”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'})
    

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

    【讨论】:

    • 确实我很接近!我对 jezrael 解决方案有一点偏好,但我也赞成你的解决方案。
    • @VonKar,为了它的价值......我也喜欢他的解决方案哈哈
    【解决方案3】:

    跟进 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
    

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 2020-03-12
      • 2015-11-28
      • 2018-11-23
      • 2020-12-17
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多