根据另一个数据框中的列有条件地格式化每列中的单元格
Conditionally format cells in each column based on columns in another dataframe
我有一个数据框,其中包含 20 多个元素的阈值,格式如下
df1:
李
硒
是
上
30
40
10
降低
10
5
1
我有另一个数据框,其中包含这些元素的值
df2:
李
硒
是
示例 1
50.8
100
20
示例 2
-0.01
2
-1
如果 df2 中的值大于上限阈值,我希望 df2 中的单元格在写入 excel 文件时背景颜色为红色。如果该值低于下限阈值,我希望单元格为黄色。
因此在示例中,50.8 的背景颜色应为红色,因为 50.8 > 30。
我以前在比较单个值时这样做过
df.style.apply(lambda x: 'background-color : red' if x>=value else '')
但我不知道如何根据 df1 中的列逐列应用它
可以使用 np.select
比较数据帧并设置条件结果:
def bounded_highlights(df):
conds = [df > df1.loc['Upper'], df < df1.loc['Lower']]
labels = ['background-color:red', 'background-color: yellow']
return np.select(conds, labels, default='')
df2.style.apply(bounded_highlights, axis=None)
DataFrames 和 Imports(略微修改了 df2,因此并非所有都突出显示):
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'Li': {'Upper': 30, 'Lower': 10},
'Se': {'Upper': 40, 'Lower': 5},
'Be': {'Upper': 10, 'Lower': 1}})
df2 = pd.DataFrame({
'Li': {'Sample 1': 50.8, 'Sample 2': -0.01},
'Se': {'Sample 1': 100, 'Sample 2': 6},
'Be': {'Sample 1': 9, 'Sample 2': -1}
})
修改后df2
:
Li Se Be
Sample 1 50.80 100 9
Sample 2 -0.01 6 -1
np.select
代码的工作原理:
conds = [df2 > df1.loc['Upper'], df2 < df1.loc['Lower']]
labels = ['background-color:red', 'background-color: yellow']
styles = np.select(conds, labels, default='')
conds
:
[ Li Se Be
Sample 1 True True False
Sample 2 False False False,
Li Se Be
Sample 1 False False False
Sample 2 True False True]
styles
标签是根据 conds
:
中的 True
值应用的
[['background-color:red' 'background-color:red' '']
['background-color: yellow' '' 'background-color: yellow']]
您可以按照此处的建议进行操作:。基本思想是制作一个包含您要使用的样式的数据框,然后应用它:
styles = pd.DataFrame('', index=df2.index, columns=df2.columns)
styles[df2 > df1.loc['Upper']] = 'background-color : red'
df2.style.apply(styles, axis=None)
这类似于 ,只是它不使用 np.select
,而是手动应用条件。
我有一个数据框,其中包含 20 多个元素的阈值,格式如下
df1:
李 | 硒 | 是 | |
---|---|---|---|
上 | 30 | 40 | 10 |
降低 | 10 | 5 | 1 |
我有另一个数据框,其中包含这些元素的值
df2:
李 | 硒 | 是 | |
---|---|---|---|
示例 1 | 50.8 | 100 | 20 |
示例 2 | -0.01 | 2 | -1 |
如果 df2 中的值大于上限阈值,我希望 df2 中的单元格在写入 excel 文件时背景颜色为红色。如果该值低于下限阈值,我希望单元格为黄色。
因此在示例中,50.8 的背景颜色应为红色,因为 50.8 > 30。
我以前在比较单个值时这样做过
df.style.apply(lambda x: 'background-color : red' if x>=value else '')
但我不知道如何根据 df1 中的列逐列应用它
可以使用 np.select
比较数据帧并设置条件结果:
def bounded_highlights(df):
conds = [df > df1.loc['Upper'], df < df1.loc['Lower']]
labels = ['background-color:red', 'background-color: yellow']
return np.select(conds, labels, default='')
df2.style.apply(bounded_highlights, axis=None)
DataFrames 和 Imports(略微修改了 df2,因此并非所有都突出显示):
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'Li': {'Upper': 30, 'Lower': 10},
'Se': {'Upper': 40, 'Lower': 5},
'Be': {'Upper': 10, 'Lower': 1}})
df2 = pd.DataFrame({
'Li': {'Sample 1': 50.8, 'Sample 2': -0.01},
'Se': {'Sample 1': 100, 'Sample 2': 6},
'Be': {'Sample 1': 9, 'Sample 2': -1}
})
修改后df2
:
Li Se Be
Sample 1 50.80 100 9
Sample 2 -0.01 6 -1
np.select
代码的工作原理:
conds = [df2 > df1.loc['Upper'], df2 < df1.loc['Lower']]
labels = ['background-color:red', 'background-color: yellow']
styles = np.select(conds, labels, default='')
conds
:
[ Li Se Be
Sample 1 True True False
Sample 2 False False False,
Li Se Be
Sample 1 False False False
Sample 2 True False True]
styles
标签是根据 conds
:
True
值应用的
[['background-color:red' 'background-color:red' '']
['background-color: yellow' '' 'background-color: yellow']]
您可以按照此处的建议进行操作:
styles = pd.DataFrame('', index=df2.index, columns=df2.columns)
styles[df2 > df1.loc['Upper']] = 'background-color : red'
df2.style.apply(styles, axis=None)
这类似于 np.select
,而是手动应用条件。