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)
解决方案
您的代码有几个问题:
首先, is 的第二个参数Series.str.contains()
是case
一个布尔值,它决定包含函数是否应该区分大小写。在您的代码中,您将您的背景颜色字符串放在那里,它的计算结果为 True 但实际上并没有做您想要的。您应该在此处查看函数的文档。
其次,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 单元。
推荐阅读
- python - Typeerror 'dict_keys' 对象不可下标
- javascript - 如何向 php 文件发送 post 请求并在 firefox extnesion 中使用 webRequest 响应?
- git - Git子模块丢失了,能找回吗?
- typescript - 我无法从 typegraphql type-orm 上的两个表中请求数据
- android - 如何阻止 Android Studio 4.0 下载最新的 sdk
- laravel - 将选择字段分隔到单独的表是否对性能很重要?
- javascript - 带有 react.lazy 的 Facebook 社交插件无法持续加载
- java - 通过蓝牙识别设备的最佳方法是什么?
- java - netbeans语句stmt问题
- node.js - 为什么我们在授权头的token前面写Bearer?