尝试使用样式中的背景色不确定这种方法是否正确
我认为我应该使用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)
答案 0 :(得分:1)
您的代码有两个问题:
首先,Series.str.contains()
的第二个参数是case
,这是一个布尔值,它决定contains函数是否应该区分大小写。在代码中,您将背景色字符串放在此处,该字符串的计算结果为True,但实际上并未执行您想要的操作。您应该看看函数的文档here。
第二,Series.str.contains()
返回布尔值索引,该值指示Series的哪些单元格包含一个字符串,但不会适当修改Series。因此,您的函数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已经保持顺序不变)。对于您的示例,这可能意味着,例如,在早期的Python版本中,IFR颜色也将应用于VLIFR或LIFR单元。