【问题标题】:Using style to color individual cells using pandas style使用样式为使用熊猫样式的单个单元格着色
【发布时间】:2020-02-21 12:32:19
【问题描述】:

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

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

【问题讨论】:

    标签: python html css pandas styles


    【解决方案1】:

    您的代码有几个问题:

    首先,Series.str.contains() 的第二个参数是case,一个布尔值,它决定包含函数是否应该区分大小写。在您的代码中,您将您的背景颜色字符串放在那里,它的计算结果为 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 保存到您的文件中。


    旁注

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

    【讨论】:

    • 它确实给了我另一个错误 ValueError: ('too many values to unpack (expected 2)', 'occured at index flt_cat') 我在 repl.it 上使用 python 3.7.4跨度>
    • 对不起,我的代码有错误,在提交之前忘记修复它,现在应该修复它。
    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2011-10-22
    • 2020-08-03
    • 2019-03-15
    相关资源
    最近更新 更多