使用样式使用样式为单个单元格着色

2024-06-16 11:38:34 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试在样式中使用背景色不确定这是否正确

我认为我应该使用if-elif语句,但它也会给我带来错误。我想我必须对我感兴趣的特定列使用loc或iloc,因为有不同的列

这个代码的主要代码是

ValueError: Function <function flt_cat_style_function_1 at 0x7f08ea52b830> returned the wrong shape.
Result has shape: (1,)
Expected shape:   (11, 1)

a=df['flt_cat']
def flt_cat_style_function_1(a): 
    df['flt_cat'].str.contains(r'VLIFR','background-color: #9400D3') 
    df['flt_cat'].str.contains(r'LIFR','background-color: #FFA500')
    df['flt_cat'].str.contains(r'IFR','background-color: #FF0000')
    df['flt_cat'].str.contains(r'MVFR','background-color: #FFFF00')        
    df['flt_cat'].str.contains(r'VFR','background-color: #00b050')       

highlighted=df.style.apply(flt_cat_style_function_1,subset='flt_cat').render()

0     VLIFR
1      LIFR
2      LIFR
3      LIFR
4       IFR
5       IFR
6      MVFR
7      MVFR
8      MVFR
9      MVFR
10      VFR
Name: flt_cat, dtype: object


with open('shtml.html','w') as f:
    f.write(highlighted) 

Tags: 代码dfstylefunctioncatcolorbackgroundshape
1条回答
网友
1楼 · 发布于 2024-06-16 11:38:34

您的代码有几个问题:

首先,Series.str.contains()的第二个参数是case,这是一个决定contains函数是否应该匹配区分大小写的布尔值。在代码中,您将背景色字符串放在那里,这些字符串的计算结果为True,但实际上并不是您想要的。您应该看看函数的文档here。你知道吗

第二,Series.str.contains()返回一个布尔索引,指示序列中的哪些单元格包含字符串,但它不会就地修改序列。所以你的函数flt_cat_style_function_1()实际上什么都不做。你知道吗

第三,由于函数也没有return语句,它将默认返回None。但是,df.style.apply()需要一个返回数组的函数,该数组正好包含11个值(即df中的行数)。这就是为什么您看到ValueError。你知道吗


我建议做以下修改:

首先,将值到背景颜色的映射放入字典:

cell_bg_colors = {
  'VLIFR': '#9400D3', 
  'LIFR': '#FFA500',
  'IFR': '#FF0000',
  'MVFR': '#FFFF00',        
  'VFR': '#00b050',
}

创建将一个单元格映射到其相应样式的函数:

def color_background(cell):
  for value, color in cell_bg_colors.items():
    if value in cell:
      return "background-color: {}".format(color)
  return ""  # default: do nothing

然后,使用Styler.applymap将此函数应用于每个单元格:

highlighted = df.style.applymap(color_background, subset="flt_cat").render()

最后,您可以将highlighted保存到您的文件中。你知道吗


旁注

这段代码只适用于在Python3.7+中正常工作,因为早期版本不能保证保留字典顺序(尽管Python3.6已经在tact中保留了顺序)。例如,这可能意味着IFR颜色在早期的Python版本中也应用于VLIFR或LIFR单元格。你知道吗

相关问题 更多 >