excel 根据另一个数据框中的列有条件地设置每列中单元格的格式

bzzcjhmw  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(173)

我有一个包含20多个元素的阈值的 Dataframe ,格式如下
df1:
| | 李姓|瑟|贝|
| - ------|- ------|- -|- -|
| 上部|三十|四十|10个|
| 较低|10个|五个|一个|
我有另一个包含这些元素值的 Dataframe
DF2:
| | 李姓|瑟|贝|
| - -|- -|- -|- -|
| 样品1|五十点八|100个|二十个|
| 样品二| -0.01 |2个|-1个|
如果df 2中的值大于阈值上限,则在将其写入Excel文件时,我希望df 2中单元格的背景颜色为红色。如果该值小于阈值下限,则我希望单元格的颜色为黄色。
所以在这个例子中,50.8的背景色应该是红色,因为50.8〉30。
我以前在比较单个值时也这样做过

df.style.apply(lambda x: 'background-color : red' if x>=value else '')

但是我不知道如何根据df 1中的列按列应用它

xienkqul

xienkqul1#

可以使用np.select比较 Dataframe 并为条件设置结果:

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)

DataFrame和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]

根据conds中的True值应用styles标签:

[['background-color:red' 'background-color:red' '']
 ['background-color: yellow' '' 'background-color: yellow']]
t1qtbnec

t1qtbnec2#

您可以按照此处的建议执行操作:How to define color of specific cell in pandas dataframe based on integer position (e.g., df.iloc[1,1]) with df.style?。基本思想是创建一个包含您要使用的样式的 Dataframe ,并应用该 Dataframe :

styles = pd.DataFrame('', index=df2.index, columns=df2.columns)
styles[df2 > df1.loc['Upper']] = 'background-color : red'
df2.style.apply(styles, axis=None)

这类似于@亨利Ecker所建议的,只是它不使用np.select,而是手动应用条件。

相关问题