基于多个条件的突出显示的值

问题描述 投票:0回答:2

我想对等于或超过准则值(当前在字典中,键(化学符号):值(准则极限)进行阴影处理(单元格)。我希望它处理多组准则并根据超出最高值的准则对单元格进行着色。下表显示了所需的输出,准则被指定了颜色,每个准则的超出部分被指定了相同的颜色。

enter image description here

这显示了针对铜,镉,二氧化硫和锌的三种不同指南(ANZECC,WHO和美国EPA)的限制。结果在下面(站点1 -3)下方,并根据超出的范围(如果有)进行突出显示。因此,对于第一个参数Cu,位点2仅超过US EPA值,因此阴影为黄色。站点1所有准则中,最高的是WHO值,因此阴影为蓝色。站点3也超出了所有准则,最大值是WHO,所以阴影也为蓝色。站点1的Cd超过了US EPA和ANZECC(相同),因此阴影为绿色(但由于US EPA限制相同,阴影可能为黄色)。站点2不超出任何准则,因此不要遮挡。站点3超出了所有指南,Cd的最高值是WHO,因此阴影为蓝色。等等。

我可以使用以下代码根据一项准则来遮盖超出部分,

#example dataframe
df=pd.DataFrame(({'Cu':[0.004, 0.0017, 0.1],  'Cd': ['0.001','0.0005',1], 'SO4': [700,"450",1500],'Zn': ['0.15','0.1','0.25'],}))
cols=df.columns

送礼

Out[7]:
      Cd      Cu   SO4    Zn
0   0.001  0.0040   700  0.15
1  0.0005  0.0017   450   0.1
2       1  0.1000  1500  0.25

#guideline values
WHO=  {'Cd' :0.002 ,'Cu' :0.003 ,'SO4':"NaN",'Zn' :0.1}
ANZECC=  {'Cd' :0.001 ,'Cu' :0.002 ,'SO4':1000.0,'Zn' :0.2}
US_EPA=  {'Cd' :0.001 ,'Cu' :0.0015 ,'SO4':500.0,'Zn' :0.01}

#highlight the relevant cells that are greater than the guideline
def fill_exceedances(x):
    color = 'orange'
    #get columns which are in keys of dict
    c = x.columns.intersection(ANZECC.keys())
    #filter columns and rename by dict
    df2 = x[c].rename(columns=ANZECC)
    #create boolean mask only for matched columns and compare
    mask = df2.astype(float).values < df2.columns[None,:].values
    #new DataFrame filled by no color
    df1 = pd.DataFrame('', index=x.index, columns=c)
    #set color by mask and add missing non matched columns names by reindex
    df1 = (df1.where(mask, 'background-color: {}'.format(color))
              .reindex(columns=x.columns, fill_value=''))

    return df1

df.style.apply(fill_exceedances, axis=None).to_excel('styled.xlsx', engine='openpyxl')

根据ANZECC指南,这给出了:

enter image description here

我不知道如何应用连续样式,因为如果我重复该过程,先前的样式将会丢失。我觉得我走错了路,并且从最低准则到后续样式都行不通。

更新:我已将准则放入一本词典中,并且可以根据所使用的准则对它们进行排序并指定颜色,但是我对如何进行操作感到困惑。

guidelines={"CEPA_FW":  {'Sulphate':1000,'Cd' :0.01 ,'Cu' :1.0 ,'Pb' :0.005 ,'Zn' :5.0}, 
 "ANZECC_Stock":{'Sulphate':1000,'Cd' :0.01,'Cu' :0.4, 'Zn' :20},
 "ANZECC_FW":  {'Sulphate':1000,'Cd' :0.0002 ,'Cu' :0.0014 ,'Pb' :0.0034 ,'Zn' :0.008}}


df=pd.DataFrame.from_records(guidelines).T
df

给予:

Out[3]:
                  Cd      Cu      Pb  Sulphate      Zn
ANZECC_FW     0.0002  0.0014  0.0034    1000.0   0.008
ANZECC_Stock  0.0100  0.4000     NaN    1000.0  20.000
CEPA_FW       0.0100  1.0000  0.0050    1000.0   5.000

然后排序准则并分配颜色,使用:

fill_color={'ANZECC_FW':'blue',
'CEPA_FW' :'green',
'ANZECC_Stock': 'yellow'}

for i in df.columns:
    col=df[i]
    col=col.sort_values(ascending=True)
    #print col,i, col.idxmax()
    #print i
    #print col
    count=0
    for val in col:

        if val>0:

            print i,val,col.index[count],fill_color[col.index[count]]

            count+=1
        else:
            continue

给予:


Cd 0.0002 ANZECC_FW blue
Cd 0.01 ANZECC_Stock yellow
Cd 0.01 CEPA_FW green
Cu 0.0014 ANZECC_FW blue
Cu 0.4 ANZECC_Stock yellow
Cu 1.0 CEPA_FW green
Pb 0.0034 ANZECC_FW blue
Pb 0.005 CEPA_FW green
Sulphate 1000.0 ANZECC_FW blue
Sulphate 1000.0 ANZECC_Stock yellow
Sulphate 1000.0 CEPA_FW green
Zn 0.008 ANZECC_FW blue
Zn 5.0 CEPA_FW green
Zn 20.0 ANZECC_Stock yellow

所以我掌握了所有信息,我只需要遍历这些顺序,即可对数据中的每一列(如果单元格值> =列表值,指定填充颜色)进行工作,但是我对如何应用一无所知这个。

我想对等于或超过准则值(当前在词典中,键(化学符号):值(准则极限)的值(单元格)进行阴影处理。我希望它处理多套...]]

python pandas styles
2个回答
0
投票

似乎这是您可以使用的方法:

import pandas as pd
guidelines={"CEPA_FW":  {'Sulphate':1000,'Cd' :0.01 ,'Cu' :1.0 ,'Pb' :0.005 ,'Zn' :5.0}, 
 "ANZECC_Stock":{'Sulphate':1000,'Cd' :0.01,'Cu' :0.4, 'Zn' :20},
 "ANZECC_FW":  {'Sulphate':1000,'Cd' :0.0002 ,'Cu' :0.0014 ,'Pb' :0.0034 ,'Zn' :0.008}}


df=pd.DataFrame.from_records(guidelines).T

fill_color={'ANZECC_FW':'blue',
'CEPA_FW' :'green',
'ANZECC_Stock': 'yellow'}

greater_than_condition = {'ANZECC_FW':100,
'CEPA_FW' :.1,
'ANZECC_Stock': 10}

def condition(i,name):
  """make it arbitarily complex"""
  return i>greater_than_condition[name]

def highlight(x):
  return [f"background-color: {fill_color[x.name]}" if condition(i,x.name) else '' for i in x]

df.style.apply(highlight,axis=1)


0
投票

首先,您遇到的几个问题:

© www.soinside.com 2019 - 2024. All rights reserved.