python - 使用样式使用 Pandas 样式为单个单元格着色

标签 python html css pandas styles

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

我想我应该使用 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) 

最佳答案

您的代码有几个问题:

首先,Series.str.contains() 的第二个参数是 case,这是一个 bool 值,它决定 contains 函数是否应该区分大小写。在您的代码中,您将背景颜色字符串放在那里,这些字符串的计算结果为 True 但实际上并没有按照您的意愿进行。您应该查看函数的文档 here .

其次,Series.str.contains() 返回一个 bool 值索引,指示系列中的哪些单元格包含字符串,但它不会就地修改系列。所以你的函数 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 保存到您的文件中。


旁注

此代码仅保证在 Python 3.7+ 中正常工作,因为早期版本不保证保留字典顺序(尽管 Python 3.6 已经保持顺序不变)。对于您的示例,这可能意味着 IFR 颜色以及早期 Python 版本中的 VLIFR 或 LIFR 单元格。

关于python - 使用样式使用 Pandas 样式为单个单元格着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58553712/

相关文章:

python - Python 中四舍五入到最近的一天

python - 使用 Xpath 在 python 中抓取问题

javascript - 如何显示图片

jquery - 添加一个类并限制html的数量

html - 选择 ul li child 而不是孙子

python - 在 Cinnamon 登录时自动加载 Python 脚本

python - pandas concat 生成 nan 值

javascript - SumoSelect 没有选择数组中的所有值

css - CSS 中有没有一种方法可以获取元素的高度(或其他属性)并与其他元素的属性共享相同的值?

html - Bootstrap 3 在移动设备上的响应能力