我想对等于或超过准则值(当前在字典中,键(化学符号):值(准则极限)进行阴影处理(单元格)。我希望它处理多组准则并根据超出最高值的准则对单元格进行着色。下表显示了所需的输出,准则被指定了颜色,每个准则的超出部分被指定了相同的颜色。
这显示了针对铜,镉,二氧化硫和锌的三种不同指南(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指南,这给出了:
我不知道如何应用连续样式,因为如果我重复该过程,先前的样式将会丢失。我觉得我走错了路,并且从最低准则到后续样式都行不通。
更新:我已将准则放入一本词典中,并且可以根据所使用的准则对它们进行排序并指定颜色,但是我对如何进行操作感到困惑。
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
所以我掌握了所有信息,我只需要遍历这些顺序,即可对数据中的每一列(如果单元格值> =列表值,指定填充颜色)进行工作,但是我对如何应用一无所知这个。
我想对等于或超过准则值(当前在词典中,键(化学符号):值(准则极限)的值(单元格)进行阴影处理。我希望它处理多套...]]
似乎这是您可以使用的方法:
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)
首先,您遇到的几个问题: