Styler 对象没有属性 style

问题描述 投票:0回答:3

这是关于根据条件将背景颜色应用于数据框的后续问题

我能够根据以下内容应用样式:

f = lambda v: 'background-color: %s' % 'green' if v=='col' else ''
df = df.style.applymap(f, subset=['a'])

我现在的挑战是我想在不同的列上做更多的过滤器。因此,如果我尝试再次在

style.applymap
上应用此
df
,我会收到标题中提到的错误。因为它可以应用于 DF 而不是 styler 对象。

作为一种解决方法,我发现对样式对象使用

df.data.style.applymap
,但它不会保留以前的样式。

我有多个过滤条件,可能涉及已应用样式的相同列。

如何依次应用多种样式?检查了文档但没有找到任何东西

python pandas pandas-styles
3个回答
4
投票

在数据帧上应用样式会返回一个 Styler 对象,而不是 DataFrame。您无法对其应用进一步的样式操作。

您可以做的是通过单个

apply
/
applymap
应用所有样式操作。

如果这太复杂,一个不太好的技巧是创建新列以使所有样式成为可能,然后使用样式操作隐藏这些列。


2
投票
f = lambda v: 'background-color: %s' % 'green' if v=='col' else ''
df = df.style.applymap(f, subset=['a'])

如果您使用单一样式意味着上面的代码可以正常工作。如果您使用多种样式意味着删除该样式。

def format_color_groups(values):
    if values =='Y':
        return  'color:red;border-collapse: collapse; border: 1px solid black;'
    elif values  == 'N':
        return  'color:green;border-collapse: collapse; border: 1px solid black;'
    else:
        return  'border-collapse: collapse; border: 1px solid black;'

df = df.style.applymap(format_color_groups)
#now df is styler so no need to add style
df = df.set_table_attributes('style="border-collapse: collapse; border: 1px solid black;"')

0
投票

以下方法对我有用。由于 df.style 返回 styler 对象,您只需使用该对象来应用不同的样式。每次使用 df.style 时,它都会返回一个新的 styler 对象,因此您不能使用多个 df.style

    # this line is the key point
    df_style = df.style
    xxxxxxx
    df_style.map(mark_color, subset_status, color='yellow')
    xxxxx
    df_style.map(mark_color, subset_studentid, color='green')
    xxxxx
    # save the style and output the excel, note that use the df_style instead of the df
    df_style.to_excel(writer, index=False, engine="openpyxl", sheet_name='Details')
    

© www.soinside.com 2019 - 2024. All rights reserved.